aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/.gitignore5
-rw-r--r--silc.icl77
2 files changed, 62 insertions, 20 deletions
diff --git a/examples/.gitignore b/examples/.gitignore
new file mode 100644
index 0000000..3914e65
--- /dev/null
+++ b/examples/.gitignore
@@ -0,0 +1,5 @@
+*.s
+
+fastfib
+fib
+lists
diff --git a/silc.icl b/silc.icl
index cd748fe..4e6e909 100644
--- a/silc.icl
+++ b/silc.icl
@@ -1,9 +1,10 @@
module silc
+import StdArray
import StdBool
import StdChar
import StdFile
-from StdFunc import o, seq
+from StdFunc import id, o, seq
import StdList
import StdMaybe
import StdOverloaded
@@ -69,15 +70,18 @@ Start w
# err = err <<< "No input file given.\r\n"
= finish 1 io err w
# infile = fromJust args.inputfile
-# (dir, module, dclfile, sysfiles, abcfile) =
- ( dir
+# (dir, module, infile, abcfile, sfile, ofile) =
+ ( if (size dir==0) ?None (?Just dir)
, name
- , dir </> addExtension name "dcl"
- , dir </> "Clean System Files"
- , dir </> "Clean System Files" </> addExtension name "abc")
+ , indir $ addExtension name "sil"
+ , indir $ addExtension name "abc"
+ , indir $ addExtension name "s"
+ , indir $ addExtension name "o"
+ )
with
(dir, name) = splitFileName $ if (ext == "sil") base` infile
(base`, ext) = splitExtension infile
+ indir s = if (size dir==0) s (dir </> s)
#! (file,w) = readFile infile w
| isError file
# err = err <<< "Could not open '" <<< infile <<< "' for reading.\r\n"
@@ -91,20 +95,12 @@ Start w
(io <<< print zero prog <<< "\r\n")
io
#! (errs, err) = if args.check
- (appSnd fromJust $ checkProgram (Just err) prog)
+ (appSnd fromJust $ checkProgram (?Just err) prog)
([], err)
| not (isEmpty errs)
= finish 1 io err w
| not args.compile
= finish 0 io err w
-#! (ok,f,w) = fopen dclfile FWriteText w
-| not ok
- # err = err <<< "Could not open '" <<< dclfile <<< "' for writing\r\n"
- = finish 1 io err w
-#! f = f <<< "definition module " <<< module
-#! (_,w) = fclose f w
-#! (_,w) = sleep 1 w
-#! (_,w) = createDirectory sysfiles w
#! (ok,f,w) = fopen abcfile FWriteText w
| not ok
# err = err <<< "Could not open '" <<< abcfile <<< "' for writing\r\n"
@@ -117,7 +113,35 @@ Start w
#! (_,w) = fclose f w
| not args.generate
= finish 0 io err w
-#! (p,w) = callProcess "/opt/clean/bin/clm" [module, "-o", module] (?Just dir) w
+#! (p,w) = callProcess "/opt/clean/exe/cg" [module, "-s", sfile] dir w
+| isError p
+ # err = err <<< snd (fromError p) <<< "\r\n"
+ = finish 1 io err w
+| fromOk p <> 0
+ = finish (fromOk p) io err w
+#! (_,f,w) = fopen sfile FAppendText w
+#! f = foldl (<<<) f options
+#! (_,w) = fclose f w
+#! (p,w) = callProcess "/usr/bin/as"
+ [ sfile
+ , "-o"
+ , ofile
+ ] dir w
+| isError p
+ # err = err <<< snd (fromError p) <<< "\r\n"
+ = finish 1 io err w
+| fromOk p <> 0
+ = finish (fromOk p) io err w
+#! (p,w) = callProcess "/usr/bin/gcc"
+ [ "-lc"
+ , "-s"
+ , "-no-pie"
+ , ofile
+ , "/opt/clean/lib/StdEnv/Clean System Files/_system.o"
+ , "/opt/clean/lib/StdEnv/Clean System Files/_startup.o"
+ , "-o"
+ , module
+ ] dir w
| isError p
# err = err <<< snd (fromError p) <<< "\r\n"
= finish 1 io err w
@@ -150,7 +174,20 @@ where
finish :: !Int !*File !*File -> *(*World -> *World)
finish ret io err = setReturnCode ret o snd o fclose err o snd o fclose io
- sleep :: !Int !*World -> *(!Int, !*World)
- sleep i w = code inline {
- ccall sleep "I:I:A"
- }
+ options :: [String]
+ options =
+ [ "\t.data\n"
+ : flatten
+ [ [ "\t.globl " +++ var +++ "\n"
+ , var +++ ":\n"
+ , "\t.quad " +++ val +++ "\n"
+ ]
+ \\ (var,val) <-
+ [ ("heap_size", "0x00200000")
+ , ("ab_stack_size", "0x00080000")
+ , ("flags", "0x00000008")
+ , ("heap_size_multiple", "0x00001400")
+ , ("initial_heap_size", "0x00019000")
+ ]
+ ] ++ ["\t.text\n"]
+ ]