grin-compiler / grin

GRIN is a compiler back-end for lazy and strict functional languages with whole program optimization support.
https://grin-compiler.github.io/
1.03k stars 38 forks source link

Modular PrimOps #64

Open andorp opened 4 years ago

andorp commented 4 years ago

The GRIN frontends should not depend on the built-in evaluation of the primitive operations. Currently we are able to define the ffi and primitive operations, but their interpretation are still tied to the Reducer.Eval, Reducer.LLVM.CodeGen modules.

The use case: I as a frontend developer, want to create my own primitive operations which suits the best to the compiler I work on. To do that, I have to define the set or primitives. Those primitives configured in the ffi/pure section in my GRIN prelude.

Stages:

  1. I would like to add their implementation to the Pure Evaluator to get the semantics right.
  2. Implement my primitive operations in the prim_ops.h / prim_ops.c which are linked during the executable generation phase
  3. Extend the LLVM codegen which my implementation for the primitives in a modular/pluginable way.
andorp commented 4 years ago

Currently I am working on the first stage, where the PrimOps.hs is defined in the Idris-GRIN-Backend repository and uses a PureEvalPlugin. I sketched the implementation in the https://github.com/grin-compiler/grin/pull/65 PR. But in the long run I would like to implement the rest of the stages too.

Anabra commented 4 years ago

Looks great.

csabahruska commented 4 years ago

My plan was to remove the GRIN primop prelude completely. Then add LLVM primops that are understood by the LLVM codegen.

andorp commented 4 years ago

I think these goals are not contradictory. We can implement the PrimOps based on the LLVM ones once they introduced.

Currently I am working with the test suite found in Idris-Dev. At this stage I need the PrimOp abstraction for the Idris-GRIN-backend to not to pollute the PrimOps in the GRIN repository. At the next stage I can start to work on adding the primops from LLVM to the GRIN. After that full featured LLVM codegen for the Idris repository could be implemented.