diff options
author | Camil Staps | 2021-01-04 20:28:34 +0100 |
---|---|---|
committer | Camil Staps | 2021-01-04 20:28:34 +0100 |
commit | c8e5a91d32631cff9e58a21789157e53481f0636 (patch) | |
tree | 88a82c5e55d99b10f2fca2387b6fae9d20859e3e | |
parent | Make up to date (diff) |
Do not use clm; use code generator directly and insert own run-time options in data section
-rw-r--r-- | examples/.gitignore | 5 | ||||
-rw-r--r-- | silc.icl | 77 |
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 @@ -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"] + ] |