Hi everyone, 

I'm new to clojure and in order to learn I'm working on making some 
compiler tools which converts a lightweight IR code into assembly.

My data model for an IR function is along the lines of
(def code
{
    :entry
        [[:loadaddr :x "global_label"]
         [:loadconst 1 :y]
         [:add :x :y :z] 
         [:jmp :exit]]
    :exit
        [[:ret :z]]
})

This, when translated to assembly and after register allocation would turn 
into something like (ignoring calling conventions etc):
(def assembly-code
{
    :entry
        [[:x86.lea :eax "global_label"]
         [:x86.loadimm 1, :eax]
         [:x86.add32 :ebx :eax] 
         [:jmp :exit]]
    :exit
        [[:ret]]
})

The problem arises when I have to query the IR code for things like 
accesses-memory? or get-output-vars in an
extensible way so that multiple target architectures can be supported.
e.g.  (get-output-vars [:add :a :b :c]) -> :c
        (get-output-vars [:x86.add :a :b]) -> :b ;; the input and output 
positions are opcode specific
        (get-output-vars [:x86.add :a :b]) -> :b
        (get-output-vars [:divmod :a :b :c :d]) -> :c :d
        (accesses-memory? :x86.add) -> false
        (accesses-memory? :x86.load) -> true
        (accesses-memory? :loadconst) ->false
I have to be able to write these functions in a way that knows about the 
format of the basic IR opcodes, but can also be extended
to handle opcodes of architectures that don't exist in my code yet, the 
extensions would exist within the namespaces of that specific architecture 
and shouldn't need to modify the code for the built in opcodes.

What is the most seamless and efficient way to achieve this sort of 
function extension in clojure? Also, how would I allow sharing
of implementations where instructions have similar layouts.

e.g.
(get-output-vars [:add :a :b :c]) -> :c
(get-output-vars [:sub :a :b :c]) -> :c



-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to