From 21dcb3e65dc88d30e8c7d03f2a5a065f06e143e8 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 28 Sep 2019 13:30:05 -0300 Subject: [PATCH] codegen: emit load instruction for (now-stack) params - comp_ctx: make ParameterMap use ptrs to Parameter --- hello | Bin 0 -> 18840 bytes src/codegen.zig | 13 +++++++++---- src/comp_ctx.zig | 9 ++++++--- 3 files changed, 15 insertions(+), 7 deletions(-) create mode 100755 hello diff --git a/hello b/hello new file mode 100755 index 0000000000000000000000000000000000000000..4825f6802137e0db6e64b3eae72f16f4e604b49b GIT binary patch literal 18840 zcmeHPdu$xV8K1p%k_&b&mlxy#&5}6O0q*?BqY2>T&X45WI*FS&w1_0j*|%pO+{3-w z3r=WNBc})}G0h)Hr4qDAZB<&KmPh}Hs;VSP6t${Ug8ERZ7LlSL%%jxMfz&=(e2OACsbY&Dt|w?C5h-|#GvFg)lc>eH zUaS_g!Pi(APF3ij&&HYhZC0qDWcQSmyXkVN$CPVGlj$70WsgkN%*rFM8lR$C{q3TXE#dr57hj zhw4E7NQV;XbND&#B)8l3AgRc_5HA_O%~-$;r>(%XDzaK&3#;Ha&Vb(yT&tpg?+iHk zUR6b3AYT0xpp9ZEpURp^q3iv_aXp#J#?z_823XS23uZiT>X~>dE4FucwYBRl;g;|Q zp?CG}&=W@97)TXNBj3BDJ)O%Mz45*@Sq@}!S!t=;s#O)KT0R+Jjc~oa^>B9V#Bjo$Eq;T<|rN7}Yk+oN2W0SE{?`(~ox}?UGv$2=1nv3CJiFDvE zT}WExu>DADD@3B$xHmT1`au}k*w|}kUF>Mdo2EHy$(?M6~R;$^kH!1Yb9YWjE!B0jo&kQHZrLk?YyL%d@C@82q3Ys zxA!}o!TxAR{bjYI{t~0jCr>BCT-o_6Mf6ME7<)ZhTKr0E^t2M&{BrS48e4bo zkM4`^j~-{4(}Gqa8OxMH^+Zm znG+=ZdK^#vy;Q<-vz)5y3w)Dc>&Kw4k#-=sEwJ?S^K0+-kBF_yZ@+n6{VIaV9zQ>b z2=w^fA>mZkJ{&ioo%C*5L<7NxeC_jQXHX%q?sBiU>S^1Ntp+-9Q{Olfwfk`#lV}emexF*df7Y%))#D5fzx0EbuN8^p7jayY zew^<@Ns(gqRrKEkk2G=MC}Y{<29XuhGVlj0!w z4Kzgq4Q&CfEwB{&ZD=pOrac2c)E**U@*?0xz>9zv0WShx1iT1%5%415Mc{vr0Dm9J z-$U{on`s@pmfuVAdg6#&m@JcW{_b*xc-(~anm$Yu6#PavAmU0#^7ZCi7S z`ldw$h>g%|RZ6VS>ooe_lG1fH5reWKj32MD1zhj* zQjga~?C)BMGx?}ww-3B!idVf>dxxYyEWs?EIcKfMQ{;u3z@J2Z< z80YV2slMCW+i%kv@D=r1ZF9Ie+*Ap)0GLX*B5U`J9bw*A;9Sd3Y1`{$pP={h+#^n@ zy@vLQ?37&Alh@NcerJm79kBF?<7NAW(w@iX!_pD+m8A=Dvt>`H-|AX!&jZpAN$A?3 z^|vxYrPWx!8Tb|YFt{!NBNFe!;adVmxvus$a&WduiiXIHp!BVUG|Dw;@J`6w_CXKQZ> zH8dPL41S?snjz-Duyo~}-0GDd#D2*uOsP=79q3T4d#(0s0#O{B5|@M{i&hoJwy z&`>^S8vSN256}5r7NsOf9y0RzYz_>Zx)cGL=|U)zOBm@^>d{m@9WsWEe(qkqYZta1 zpeVgqFcM;VjAU;!J#STUt>AqrmHN0hN1TYAS24@cs^ZJU`l>k3 z)+&9ef@gJZoM&@xoNm6;lPc&bG(D+e<#Z58`B~?X;t7FK`)FITUe`HIvJ$_DZ6cz6c=Zvm(JxUcK) z1J}x4r!w?8?E*~HcwWwulY~?7r4i4AUj$C^*JORHcQ-IPizA5fzbS%@BRwJYd*t=P z^YvGNlfFA{Z%O?PGR`g17wuDBfOa)SY=GY$NM z=TN8k{ka@;x9yJZ=+rxRcIen=S*e{6ddFQmqdU6VD<#%65fEmBdS^^}h;{51`u6T! zZP9Lh*S2kYI(zlrXj^wDd9}8IV*Y5=TO?cln5i7rq2a=zj2Z6( zHS;zd8y;$w20Y(xwPoK?oxo9>{?;jbWT=Ktd^J^-|avltXYZ0VmAaruJC0 zEjW)7;+a%GiqDzk8I_~n4kOSaj0+-zK@QC5D-OUUo*lr|BiU3ond5xCuP<*LWR4aV zoJY7gE6uB1&z}^cnGJ3+cox}-=haM?OPmSmIuk86={F*_=lM6&dZ#k-d|zXDBQj2V zo~JX_SW!~9eFyLl@EZ}A&+~bvTt5F!LGuP@+6e|v;d1?X-p}+YsZ94pYCGHW?_GBS zqh}VE&+7xGM<8=1cl-`ONWX!xJ+C8}2Bb09pY@pD2RZ$w#yqb#m}=7AU4IFS!^luf z*`C)WOwUV2F5lgLY9HCRNj?7EkSWKB?CG~fxBVl)C?@6S4$nI!B^zg=vYcrQjMH9| zc4g{RM&9LKJnFKKNCl=`Uv|Sh(2-xP12aJ(oSN!2^|BpmJmY_bfW{t|&+~o$UlIQQ5FVdw$Nl&iY^nWh z&+F6k^urobgH6h3wrBb#Bu;w~k*ZBL)g;S=?U?=p0;jzeu{AYm@9uxLV}BnaLm1be z=d0_by}Q4uEN8k3hA^pK7P0-RGGb@gp6MK9IPX-wM>;&`1d$KA_-kjdZ)&y`pL6NE z%UU&q{j1VG^Iz blk: { var param = metadata.from_function.?.parameters.get(vari.lexeme).?.value; - // var llvm_func = self.llvm_table.get(self.current_function_name.?).?.value; - // break :blk llvm.LLVMGetParam(llvm_func, @intCast(c_uint, param.idx)); - std.debug.warn("fn param alloca {} {}\n", param.name, param.llvm_alloca); - break :blk param.llvm_alloca.?; + var buf = try self.allocator.alloc(u8, 512); + errdefer self.allocator.free(buf); + + var load_str = try std.fmt.bufPrint(buf, "{}_loaded", param.name); + + var load_cstr = try std.cstr.addNullByte(self.allocator, load_str); + errdefer self.allocator.free(load_cstr); + + break :blk llvm.LLVMBuildLoad(builder, param.llvm_alloca.?, load_cstr.ptr); }, .Scope => @panic("TODO local variables"), diff --git a/src/comp_ctx.zig b/src/comp_ctx.zig index a786770..afbe5e4 100644 --- a/src/comp_ctx.zig +++ b/src/comp_ctx.zig @@ -85,7 +85,7 @@ pub const Parameter = struct { llvm_alloca: llvm.LLVMValueRef = null, }; -pub const ParameterMap = std.StringHashMap(Parameter); +pub const ParameterMap = std.StringHashMap(*Parameter); // functions, for our purposes, other than symbols, have: // - a return type @@ -274,11 +274,14 @@ pub const CompilationContext = struct { var param_map = ParameterMap.init(self.allocator); for (decl.params.toSlice()) |param, idx| { - _ = try param_map.put(param.name.lexeme, Parameter{ + var param_sym = try self.allocator.create(Parameter); + + param_sym.* = Parameter{ .name = param.name.lexeme, .idx = idx, .typ = param_types.at(idx), - }); + }; + _ = try param_map.put(param.name.lexeme, param_sym); } const lex = decl.func_name.lexeme;