From 0bb66acae00318ad464f40379877bc88d21e5264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Fri, 15 May 2026 23:08:53 -0600 Subject: [PATCH] callGCC --- app/Main.hs | 22 ++++++++++++++++++++-- play/t | Bin 0 -> 15896 bytes play/t.anf | 2 +- play/t.s | 4 ++-- play/t.scm | 2 +- play/t.ssa | 7 +++++-- 6 files changed, 29 insertions(+), 8 deletions(-) create mode 100755 play/t diff --git a/app/Main.hs b/app/Main.hs index 25acb9c..8618420 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -1,5 +1,6 @@ {-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedLists #-} +{-# LANGUAGE ViewPatterns #-} module Main (main) where @@ -15,7 +16,7 @@ import Options.Applicative import Control.Lens import Data.Generics.Labels import System.OsPath (OsPath) -import System.FilePath ((-<.>)) +import System.FilePath ((-<.>), dropExtension) import Effectful.FileSystem import Effectful import Effectful.FileSystem.IO qualified as FS @@ -88,13 +89,29 @@ callQBE callQBE f = do let asm_file = f -<.> "s" qbe_file = f -<.> "ssa" - C.StdoutTrimmed stdout <- + C.StdoutUntrimmed stdout <- C.run $ C.cmd "qbe" & C.addArgs [qbe_file] FS.withFile asm_file FS.WriteMode \h -> do hPutStr h stdout hPutStrLn FS.stderr $ "wrote " <> T.pack asm_file pure asm_file +callGCC + :: (GenSym :> es, FileSystem :> es, IOE :> es) + => FilePath -> List String -> Eff es FilePath +callGCC f args = do + let asm_file = f -<.> "s" + exe = dropExtension f + C.StdoutTrimmed (T.words -> flags) <- + C.run $ C.cmd "pkg-config" + & C.addArgs @String ["--cflags", "--libs", "bdw-gc"] + C.run_ $ C.cmd "cc" + & C.addArgs flags + & C.addArgs ["-o", exe, asm_file] + & C.addArgs args + hPutStrLn FS.stderr $ "wrote " <> T.pack exe + pure exe + driver :: (GenSym :> es, FileSystem :> es, IOE :> es) => Options -> Eff es () @@ -103,4 +120,5 @@ driver = runGenSym . traverseOf_ (#sourceFiles . folded) \f -> do anfs <- toANF f exps qbe <- toQBE f anfs callQBE f + callGCC f ["../runtime/gyehoek.c"] pure () diff --git a/play/t b/play/t new file mode 100755 index 0000000000000000000000000000000000000000..b1af0b5ee0309704498734c293c041e8c8ca369a GIT binary patch literal 15896 zcmb<-^>JfjWMqH=W(GS35HCOgBH{p{7-pD384L^z4h$9yybKNuatyKzYzzzxEMPH+ zJWM@|zQF_$htV7mE(0@Ep9F}(z`%e`2Se4tXpoygLLeGsABc?&C$K|AVKf8OA0U0K zASoyxCJv+5f)p??Fu-V-I7k?5p8`lT0|NsZ9RO0mz`y{bk@bPXra~8@ufi6Uo&gP) z1yCBM55xuO>wxO(fa-(M1|S6t3=A+D7M>tCg762Z`_O4ve86aQeFlmU_o35JR%QVj{PA{t}$jC`7GDx(jNU|_V&#^Si)J;!L)-^QMGtx8A z1t;swBv3RlF)%VPGB7hRGO&Q_3Xm9x-vy3S5RZYOR4S7bR5Q$kij_!$_{@)At^1(G-@Pr}4MAc=$WDNOtak~qi?nD_;#I4CcI@-0k!lpYO%(GVC7fzc2c z4S~@R7!85J76PC7<$ifIzv1xcX1%G;z~Iq(poHoF1&`(<9EZV9{ck!;pMl}O>KuIr z27Y-5hX1M{eg;VH<%9qK|NmFrq|d;RHUT66!XWbu-+FdljPvMxd z04Y2Sr9FCWBSDhAra>S|^PflO2akjA>^%$iT#)Y?GOro0^iDSdyxsnv-J3 z#h`4Hk(yYbke`&5np~ownp0uN#lXP8D9voG0iC!1^8Ww-7zPFgkq`g>gL?8RAO8P$ zVPIfT`S}0;9FREF8H`my42%^5jM6;p91|EB7(^Ht7-Se27;e1(|6dKH#)Ta`qocyW zz+l3_z%b$c|Nr25L_PsGJ_#>=?sAR>274)MEn^k%G$Kep$li|k|Nq10en7^6^pr3# zFf@Gl|KArR;K(P?#^lM%7Q@BE&f&!!#={O)4w{=WU|?VX&FQ%Ng)%TTFdP7h!RCq> z85mLcOlW+NT9AW5>OuNJR)OY?K;Z*okK)k~7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5I_$B*!niudNxph0;C4ihXK(rem#f->U%+H&>A}s6SO`PMDGC+3=9lBP#U(5m>0@l z09{8X3FX7q*-1nB;7$<(1A`Ql4_j{s>Z5^#VDg}T4~Sm?>g+HuFns;@KOe+j0p)}G zQy~5Xs6yDBuSpR4t)MMNr#h`WHP+Am9!zidWh8@s#b)flEkemdFKV93FX850WzDK7`7f9-Apr3=M-I#2tI86q`R}Tm4b%5U#O-6WZ@?Py&(Uy zFns)vt_&2uj10mIu=V7i{y9jEFnIg`Q@uO`Xf-G=Lj#)oLCeya7moo)jbo!nII)Vfhgx2Ev_S^&;?fsUR^BUV+2? zn{bGO@+TvMAj2D20DugEVr=0CS|q{9AjW_mzn8&!1Q=lJ<-uGA28L%~cZ$RF2~7MC zj&<6SjEF4^Fts4s4=gSL+S~!+!m%kMXq~nMJUn3%HjE4mLQH%Nu<`{a?gSEN;AIGa zmOJ3F7zPFgAE-GD(0GBVj|AHb<00q_Mg|5!CJ6>ux`fG;g2Wm4;humNHw-Oc^D)VBv;hFM^7m?{Ll8RQ-&%<$Qd!(TTUv9E{! z0y3Y83l!K0!$GXz#nQhUB7>q}24xykNb22E;=7_>$cCWYALi zVutwml>GSgocyH3ocNTI{G#Ic#L^0em%DnJY3GvgDBiV`d1Q}arS zDjCv>5_41IQ%ZAlD;eVBk$CZ$d6^|BN}+4r^^!r(OU+9GIW9ilEy&T=HQv?F1+-e< zCDPB)*VCCHKHl9gG~U$%D(m4A#1QZ92c| zm!xFo#g`VRra;#J$HylX7en|E-5I=FGwvase}qSI(h1X(ks|(NMeB)31g>J<|XE4 zCNt{LN!uR1pxeTD@E7S^@5SX3? Rsu&m;82*8I2m;MG1_1dsR2BdL literal 0 HcmV?d00001 diff --git a/play/t.anf b/play/t.anf index 1026f62..831ceda 100644 --- a/play/t.anf +++ b/play/t.anf @@ -1,4 +1,4 @@ ;;; -*- mode:scheme -*- -(let ((x0 (prim:write 4))) x0) +(let ((x0 (prim:+ 2 4)) (x1 (prim:write x0))) x1) diff --git a/play/t.s b/play/t.s index 83a7477..f8824c4 100644 --- a/play/t.s +++ b/play/t.s @@ -3,7 +3,7 @@ main: pushq %rbp movq %rsp, %rbp - movl $18, %edi + movl $30, %edi callq scm_write leave ret @@ -11,4 +11,4 @@ main: .size main, .-main /* end function main */ -.section .note.GNU-stack,"",@progbits \ No newline at end of file +.section .note.GNU-stack,"",@progbits diff --git a/play/t.scm b/play/t.scm index 321e540..8895d2c 100644 --- a/play/t.scm +++ b/play/t.scm @@ -1 +1 @@ -(prim:write 4) +(prim:write (prim:+ 2 4)) diff --git a/play/t.ssa b/play/t.ssa index 8e05fd5..9b6d236 100644 --- a/play/t.ssa +++ b/play/t.ssa @@ -1,6 +1,9 @@ export function w $main () { @start - %x0 =l call $scm_write (l 18) - ret %x0 + %.2 =l add 10, 18 + %.3 =l and %.2, 18446744073709551613 + %x0 =l or %.3, 2 + %x1 =l call $scm_write (l %x0) + ret %x1 } \ No newline at end of file