diff options
| author | Shagun Agrawal <agrawalshagun07@gmail.com> | 2024-08-04 22:20:38 +0530 |
|---|---|---|
| committer | Shagun Agrawal <agrawalshagun07@gmail.com> | 2024-08-04 22:20:38 +0530 |
| commit | c3fdb442e642ca50ad4dc6c942e4ebcb9cbaad3b (patch) | |
| tree | 5f6d826ee4ef4f492bc1fe88163000b52497b7e1 /src/cljcc/emit.clj | |
| parent | e0de6ddf16a37435966e31a73b4425a0300dc1e6 (diff) | |
Add assembly generation for unary operators
Adding assembly generation
New opcodes, operands
Diffstat (limited to 'src/cljcc/emit.clj')
| -rw-r--r-- | src/cljcc/emit.clj | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/cljcc/emit.clj b/src/cljcc/emit.clj new file mode 100644 index 0000000..3cd4f00 --- /dev/null +++ b/src/cljcc/emit.clj @@ -0,0 +1,47 @@ +(ns cljcc.emit + (:require [cljcc.parser :as p] + [cljcc.util :refer [get-os]] + [clojure.string :as str])) + +(defn handle-function-name [name] + (if (= :mac (get-os)) + (str "_" name) + name)) + +(defn emit-instruction + ([inst] + (str " " (symbol inst))) + ([inst src dst] + (str " " (symbol inst) " " "$" src ", %" (symbol dst)))) + +(defn statement-fn [stmt] + (condp = (:op stmt) + :ret (emit-instruction :ret) + :movl (emit-instruction (:op stmt) (:src stmt) (:dst stmt)))) + +(defn emit-function-assembly [fn-ast] + (let [name (handle-function-name (:identifier fn-ast)) + globl-line (str " .globl " name) + fn-start-line (str name ":") + body-statements (map statement-fn (:body fn-ast))] + (flatten [globl-line fn-start-line body-statements]))) + +(def linux-assembly-end ".section .note.GNU-stack,\"\",@progbits") + +(defn emit-assembly [ast] + (let [fn-assembly (emit-function-assembly (first ast))] + (if (= :linux (get-os)) + (concat fn-assembly [linux-assembly-end]) + fn-assembly))) + +(defn join-assembly [assembly-lines] + (str/join "\n" assembly-lines)) + +(comment + + (def ex "int main(void) {return 2;}") + + (-> ex + p/parse) + + ()) |
