summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Gunger <kgunger12@gmail.com>2023-03-18 18:50:47 -0400
committerKyle Gunger <kgunger12@gmail.com>2023-03-18 18:50:47 -0400
commit80b6af60eb8b9d971b9710ae9d91c2639a9e875f (patch)
treeea1afd7ac7125163e4f987bc43a9ec8af4ac7796
parentd21c66af96878e5efff081ec861af4350d37bffe (diff)
File level ASM + Change scope naming
-rw-r--r--tnslc/c_wrap.tnsl10
-rw-r--r--tnslc/tnslc.tnsl92
2 files changed, 47 insertions, 55 deletions
diff --git a/tnslc/c_wrap.tnsl b/tnslc/c_wrap.tnsl
index d1004bb..93ea3e4 100644
--- a/tnslc/c_wrap.tnsl
+++ b/tnslc/c_wrap.tnsl
@@ -1,3 +1,7 @@
+asm "extern malloc"
+asm "extern realloc"
+asm "extern free"
+
/; _alloc (uint size) [~void]
~void out
# Mov size into proper register, and set all extras to zero
@@ -8,7 +12,7 @@
asm "mov r8, 0"
asm "mov r9, 0"
asm "mov r10, 0"
- asm "call malloc wrt ..got"
+ asm "call malloc"
# Set out to the returned value
# (The compiler assignes spaces sequentially, and we have a uint in r8)
asm "mov r9, rax"
@@ -26,7 +30,7 @@
asm "mov r9, 0"
asm "mov r10, 0"
# Do call
- asm "call realloc wrt ..got"
+ asm "call realloc"
# Set out to the returned value
# (The compiler assignes spaces sequentially. We have a ptr in r8, and a uint in r9)
asm "mov r10, rax"
@@ -43,7 +47,7 @@
asm "mov r9, 0"
asm "mov r10, 0"
# do call
- asm "call free wrt ..got"
+ asm "call free"
# there's no more to do 'cause free returns nothing
;/
diff --git a/tnslc/tnslc.tnsl b/tnslc/tnslc.tnsl
index 582afbd..06fc6dc 100644
--- a/tnslc/tnslc.tnsl
+++ b/tnslc/tnslc.tnsl
@@ -380,7 +380,6 @@
/; method Type
/; sprint [{}uint8]
- ;log_debug("Sprinting Type")
;{}uint8 out = string_join( {"{ ", int_to_string(self.s), ", ", self.name, ", ", self.mod_name, ", { "}, "")
;{}{}uint8 pch = {}
/; loop (int i = 0; i < len(self.ptr_chain)) [i++]
@@ -633,14 +632,11 @@
/; loop (pc > 1) [pc = len (out.data_type.ptr_chain)]
/; if (out.data_type.ptr_chain{pc - 1} == PTYPE.REFERENCE)
- ;log_debug("Stripping")
;out.strip_one(data)
;; else
- ;log_debug("Breaking")
;break
;/
;/
- ;log_debug("Strip complete")
;return out
;/
@@ -943,7 +939,6 @@
;/
;struct Scope {
- {}int level,
int num, c,
~Scope parent,
{}uint8 name,
@@ -952,27 +947,17 @@
/; method Scope
/; is_cf [bool]
- ;{}{}uint8 split = string_split(self.name, '_')
- /; if (len split == 0)
+ /;if (len(self.name) < 1)
;return false
;/
- /; if (split{0}{0} == '#')
- /; loop (int i = 1; i < len split; i++)
- /; if (len split{i} > 0)
- /; if (split{i}{0} < '0' || split{i}{0} > '9')
- ;return false
- ;/
- ;; else
- ;return false
- ;/
- ;/
- ;return true
- ;/
- ;return false
+ ;return self.name{0} == '#'
;/
/; cf_type ({}uint8 cf) [bool]
;{}{}uint8 split = string_split(self.name, '_')
+ /; if (len split !> 1)
+ ;return false
+ ;/
;return string_equate(split{0}, string_add("#", cf))
;/
@@ -980,7 +965,6 @@
;{}uint8 out = ""
/; if (self.is_cf())
;out = self.parent`.full_label()
- ;out.append('_')
;/
;out = string_add(out, self.name)
;return out
@@ -989,14 +973,13 @@
/; get_size [int]
;int out = 0
/; loop (int i = 0; i < len (self.vars)) [i++]
- ;out = out + self.vars{i}.s
+ ;out = out + self.vars{i}.norm_size()
;/
;return out
;/
/; next_register [int]
;int out = 8
-
/; if (self.is_cf())
;out = self.parent`.next_register()
;/
@@ -1019,7 +1002,7 @@
/; loop (int i = 0; i < len (self.vars)) [i++]
/; if (self.vars{i}.loc_type == LOCATION.STACK)
- ;out = out + self.vars{i}.s
+ ;out = out + self.vars{i}.norm_size()
;/
;/
@@ -1029,12 +1012,12 @@
/; get_full_stack [int]
;int out = 0
/; if (self.is_cf())
- ;out = self.parent`.get_stack()
+ ;out = self.parent`.get_full_stack()
;/
/; loop (int i = 0; i < len (self.vars)) [i++]
/; if (self.vars{i}.loc_type == LOCATION.STACK)
- ;out = out + self.vars{i}.s
+ ;out = out + self.vars{i}.norm_size()
;/
;/
@@ -1043,6 +1026,7 @@
/; next_loc (Type t) [int]
/; if (is_primitive(t.name) !< 0 || len (t.ptr_chain) > 0)
+ ;log_debug("Next reg")
;return self.next_register()
;/
;return -1
@@ -1090,16 +1074,11 @@
/; new_sub_cf ({}uint8 cf) [Scope]
;cf = string_add("#", cf)
- ;{}int s = self.level
- ;s.append(self.num)
+ ;cf.append('_')
+ ;cf = string_add(cf, int_to_string(self.num))
;self.num++
- /; loop (int i = 0; i < len (s)) [i++]
- ;cf.append('_')
- ;cf = string_add(cf, int_to_string(s{i}))
- ;/
-
- ;return {s, 0, 0, ~self, cf, {}}
+ ;return {0, 0, ~self, cf, {}}
;/
/; get_continue (uint i) [{}uint8]
@@ -1124,6 +1103,7 @@
/; new_var (Type t, {}uint8 name, ~CompData out)
;Variable new = {name, t, 0, 0}
+ ;log_debug(string_add("Creating new variable ", new.sprint()))
/; if (self.next_loc(t) !< 0)
;new.loc_type = LOCATION.REGISTER
;new.location = self.next_loc(t)
@@ -1208,7 +1188,7 @@
/; if (self.is_cf())
;return self.parent`.next_const()
;/
- ;{}uint8 out = string_add(self.name, string_add("_#const_", int_to_string(self.c)))
+ ;{}uint8 out = string_add(self.name, string_add("#const_", int_to_string(self.c)))
;self.c++
;return out
;/
@@ -1893,7 +1873,7 @@
;refer.location = 2
;/
- ;log_debug(wk.sprint())
+ ;log_debug(string_add("Eval dot initial val: ", wk.sprint()))
;refer.data_type.ptr_chain.append(PTYPE.REFERENCE)
/; if (tok`{start}.cmp("."))
@@ -1904,9 +1884,6 @@
;refer = wk.deref(out)
;/
;start++
-
- ;tnsl.io.println(refer.name)
- ;tnsl.io.println(refer.data_type)
/; loop (start < max) [start++]
/; if (tok`{start}.cmp("`"))
@@ -2018,7 +1995,7 @@
;/
;log_debug(string_join( {
- "_eval_value called with following type info:", t.name, int_to_string(t.s)
+ "_eval_value called with following type info:", t.sprint()
}, " "))
;Variable wk = {"#wk", t, 1, LOCATION.REGISTER}
@@ -2095,6 +2072,7 @@
/; loop (tok`{cur`}.type_is(TOKEN.DEFWORD))
;scope`.new_var(t, tok`{cur`}.data, out)
;eval_value(tok, cur, out, current, scope, t, false)
+
/; if (tok`{cur`}.cmp(","))
;cur` = next_non_nl(tok, cur` + 1)
;/
@@ -2129,7 +2107,7 @@
;/
/; compile_block (~{}Token tok, ~int cur, ~Module current, ~CompData out)
- ;Scope root = {{}, 0, 0, 0, "", {}}
+ ;Scope root = {0, 0, 0, "", {}}
;int max = find_closing(tok, cur)
;bool r = false, m = false, returned = false
;Type ret = NO_TYPE
@@ -2184,7 +2162,7 @@
/; loop (cur` = next_non_nl(tok, cur` + 1); cur` < max && !returned) [cur` = next_non_nl(tok, cur` + 1)]
/; if (tok`{cur`}.cmp("/;") || tok`{cur`}.cmp(";;"))
- ;tnsl.io.println("block")
+ ;tnsl.io.println("Block block")
/; if (m)
;compile_block(tok, cur, current, out)
;; else
@@ -2220,10 +2198,10 @@
;tnsl.io.println(tok`{cur`}.data)
;/
;; else if (is_definition(tok, cur, current))
- ;tnsl.io.println("def")
+ ;log_debug("Block def")
;eval_def(tok, cur, out, current, ~root)
;; else
- ;tnsl.io.println("val")
+ ;log_debug("Block val")
;eval_value(tok, cur, out, current, ~root, NO_TYPE, false)
;/
;/
@@ -2303,20 +2281,20 @@
;/
;continue
;; else if (tok`{cur`}.cmp("/;") || tok`{cur`}.cmp(";;"))
- ;tnsl.io.print("block")
+ ;log_debug("Mod block")
/; if (tok`{cur` + 1}.cmp("export") || tok`{cur` + 1}.cmp("module"))
;module_pass_two(tok, cur, current, out, f)
;; else
;compile_block(tok, cur, current, out)
;/
;; else if (tok`{cur`}.cmp("struct"))
- ;tnsl.io.print("struct")
+ ;log_debug("Mod struct")
;skip_struct(tok, cur)
;; else if (tok`{cur`}.cmp("enum"))
- ;tnsl.io.print("enum")
+ ;log_debug("Mod enum")
;compile_enum(tok, cur, current, out)
;; else if (is_definition(tok, cur, current))
- ;tnsl.io.print("def")
+ ;log_debug("Mod def")
;compile_file_def(tok, cur, current, out)
;; else if (!(tok`{cur`}.cmp("\n")))
;tnsl.io.println("Failed to recognize file-level statement")
@@ -2408,21 +2386,31 @@
;/
;continue
;; else if (tok{i}.cmp("/;") || tok{i}.cmp(";;"))
- ;tnsl.io.print("block")
+ ;log_debug("Root block")
/; if (tok{i + 1}.cmp("export") || tok{i + 1}.cmp("module"))
;module_pass_two(~tok, ~i, current, ~out, f)
;; else
;compile_block(~tok, ~i, current, ~out)
;/
;; else if (tok{i}.cmp("struct"))
- ;tnsl.io.print("struct")
+ ;log_debug("File struct")
;skip_struct(~tok, ~i)
;; else if (tok{i}.cmp("enum"))
- ;tnsl.io.print("enum")
+ ;log_debug("File enum")
;compile_enum(~tok, ~i, current, ~out)
;; else if (is_definition(~tok, ~i, current))
- ;tnsl.io.print("def")
+ ;log_debug("File def")
;compile_file_def(~tok, ~i, current, ~out)
+ ;; else if (tok{i}.cmp("asm"))
+ ;log_debug("File asm")
+ /; if (len (out.csec) == 0 && len (out.dsec) == 0)
+ ;out.hsec = string_add(out.hsec, unquote_str(tok{i + 1}.data))
+ ;out.hsec.append('\n')
+ ;; else
+ ;out.dsec = string_add(out.dsec, unquote_str(tok{i + 1}.data))
+ ;out.dsec.append('\n')
+ ;/
+ ;i++
;; else if (!(tok{i}.cmp("\n")))
;tnsl.io.println("Failed to recognize file-level statement")
;tok{i}.print()