Hello!
First of all, thanks for any help provided.
I am writing a toy programming language as an excuse for learning MLIR. I have already some constructs like pattern matching and destructuring working nicely. Now I am trying to add the possibility to declare variables in the language. For this reason I added some operations to my dialect. If I am not incorrect, there are two APIs available to work with Operations, either through results-operands chains or through symbols. I am trying the latter approach for this feature I want to implement.
I implemented the following Operands:
- tmplang.subprogramParam: Allows me to declare a parameter
- tmplang.varRef: Allows me to use of prev-defined parameter
An example of MLIR described would be the following:
tmplang.subprogram private @foo(%arg0: i32) -> i32 {
tmplang.subprogramParam(%arg0) "private" @a : i32
%1 = tmplang.varRef @a : i32
...
The problems I am finding are the following:
-
My conversions passes are organized in the following manner (just describing the relevant ones):
1º - TmplangToFunc: tmplang.subprogram and tmplang.return to FuncOp operations, func.FuncOp and func.ReturnOp respectively
2º - TmplangToLLVM: FuncOps to LLVM, and rest of Tmplang to LLVM (tmplang.subprogramParam, tmplang.varRef, etc)In the 1º step the problem I find is that when transforming tmplang.subprogram to func.FuncOp the symbol table disapears since func.FuncOp does not have the trait SymbolTable. This makes impossible to proceed with 2º. Does this I mean I have to leave out the FuncOp dialect and implement my own solution?
-
I want to to lower in the pass TmplangToLLVM the operands in the following manner:
-
tmplang.subprogramParam: alloca + store
-
tmplang.varRef: just be able to reference the alloca of the referenced variable
The problem I am finding is that I have no way to reference the alloca when lowering the tmplang.varRef. I am not finding any SymbolTable method that allows me doing this. Are symbols only for global values (functions, gobal vars, etc)? I am approaching this in the wrong way and I should stick with the results-operands approach?
I would like to know what I am doing wrong and if possible what are the steps, docs, etc; needed to fix them.
Thanks again!