From 28d632d51c9f7957dc17e62286e5248997ce8d92 Mon Sep 17 00:00:00 2001 From: sofia Date: Tue, 15 Jul 2025 01:16:21 +0300 Subject: [PATCH] Add Makefile by @neon, fix array typechecking during typeinference --- .gitignore | 1 + Makefile | 17 +++++++++++++++ libtest.sh | 16 ++++++++------ reid/src/mir/typeinference.rs | 8 +++++-- reid/src/mir/typerefs.rs | 31 ++++++++++++++------------- reid_src/array | Bin 0 -> 14632 bytes test.ll | 38 ---------------------------------- 7 files changed, 49 insertions(+), 62 deletions(-) create mode 100644 Makefile create mode 100755 reid_src/array delete mode 100644 test.ll diff --git a/.gitignore b/.gitignore index b8c37e2..7449051 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ main reid_src/*.o reid_src/*.ll reid_src/*.asm +reid_src/*.out diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6c323ca --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +SRC=foo.reid +BIN=$(SRC:.reid=.out) + +REID=cargo run --example cli +LD=ld +LDFLAGS= + +all: $(BIN) +clean: + rm -f $(BIN) $(SRC:.reid=.o) $(SRC:.reid=.asm) $(SRC:.reid=.ll) + +$(BIN): $(SRC:.reid=.o) + $(LD) -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/crt1.o -lc $(LDFLAGS) $< -o$@ + +.SUFFIXES: .o .reid +.reid.o: + $(REID) $< \ No newline at end of file diff --git a/libtest.sh b/libtest.sh index 925df65..a0c52d1 100755 --- a/libtest.sh +++ b/libtest.sh @@ -5,13 +5,17 @@ # # Do note this file is extremely simply for my own personal convenience -export .env -cargo run --release --example cli $1 && \ -# clang hello.o -o main && \ -ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 \ - -o main /usr/lib/crt1.o hello.o -lc && \ -./main ; echo "Return value: ""$?" +# export .env +# cargo run --release --example cli $1 && \ +# # clang hello.o -o main && \ +# ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 \ +# -o main /usr/lib/crt1.o hello.o -lc && \ +# ./main ; echo "Return value: ""$?" +$BINARY="$($1 | cut -d'.' -f1)"".out" + +make clean SRC=$1 && make SRC=$1 && echo "" && \ +$BINARY ; echo "Return value: ""$?" ## Command from: clang -v hello.o -o test ## Original command: diff --git a/reid/src/mir/typeinference.rs b/reid/src/mir/typeinference.rs index 2ca430b..56bacb2 100644 --- a/reid/src/mir/typeinference.rs +++ b/reid/src/mir/typeinference.rs @@ -163,7 +163,9 @@ impl IndexedVariableReference { } super::IndexedVariableReferenceKind::Index(inner, _) => { if let Some((mutable, inner_ref)) = inner.find_hint(hints)? { - let inner_ty = inner_ref.as_type(); + // Check that the resolved type is at least an array, no + // need for further resolution. + let inner_ty = inner_ref.resolve_weak().unwrap(); match inner_ty { Array(type_kind, _) => Ok(hints .from_type(&type_kind) @@ -284,7 +286,9 @@ impl Expression { ExprKind::Index(expression, index_ty, _) => { let expr_ty = expression.infer_types(state, type_refs)?; - let kind = unsafe { expr_ty.resolve_type() }; + // Check that the resolved type is at least an array, no + // need for further resolution. + let kind = expr_ty.resolve_weak().unwrap(); match kind { Array(type_kind, _) => { let elem_ty = type_refs.from_type(&type_kind).unwrap(); diff --git a/reid/src/mir/typerefs.rs b/reid/src/mir/typerefs.rs index 13a09e5..783be30 100644 --- a/reid/src/mir/typerefs.rs +++ b/reid/src/mir/typerefs.rs @@ -15,23 +15,22 @@ use super::{ pub struct TypeRef<'scope>(TypeIdRef, &'scope ScopeTypeRefs<'scope>); impl<'scope> TypeRef<'scope> { - pub unsafe fn resolve_type(&self) -> TypeKind { - unsafe { - let resolved = self - .1 - .types - .hints - .borrow() - .get_unchecked(*self.0.borrow()) - .clone(); + /// Resolve current type in a weak manner, not resolving any Arrays or + /// further inner types + pub fn resolve_weak(&self) -> Option { + Some(self.1.types.retrieve_type(*self.0.borrow())?) + } - match resolved { - TypeKind::Array(elem_ty, len) => { - let resolved_elem_ty = self.1.from_type(&elem_ty).unwrap().resolve_type(); - TypeKind::Array(Box::new(resolved_elem_ty), len) - } - _ => resolved, + /// Resolve type deeply, trying to resolve any inner types as well. + pub fn resolve_deep(&self) -> Option { + let resolved = self.resolve_weak()?; + + match resolved { + TypeKind::Array(elem_ty, len) => { + let resolved_elem_ty = self.1.from_type(&elem_ty).unwrap().resolve_weak()?; + Some(TypeKind::Array(Box::new(resolved_elem_ty), len)) } + _ => Some(resolved), } } @@ -48,7 +47,7 @@ impl<'scope> std::fmt::Debug for TypeRef<'scope> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_tuple("Hint") .field(&self.0) - .field(unsafe { &self.resolve_type() }) + .field(&self.resolve_deep().unwrap()) .finish() } } diff --git a/reid_src/array b/reid_src/array new file mode 100755 index 0000000000000000000000000000000000000000..2bf608c9ae750a1101d7b9c38e3a4fd5fd57810d GIT binary patch literal 14632 zcmeHOTWB0r7(Usi&9(_mn%+Vy?Vzz%A(L#Hgs9j~?wb`pY% z2Ny3$DMEdbf)DmdLH7cY{NL`nrcx|E2%BlbNP09CNp#9m9eSuP(y=)gw$chp3~;(kSUcqcu2bv8&oaIQyprz+C-5?Iy_y& z+E~z6LZ$*bEO{G9Gp;E0#gIoH`yQ1_J)p~~#t2z6t}33GMmtgot=ddA<2JG>zLNPt ze`V4XH1aC_Ig;Rb#t0_ zknuq~I!eE*=z3g9DoTQbMm{vSKlyDC|2O?TLpYw_y$XJ=6Vl(^_`D*#K#Qxo=Thee z`nu=hU300-!eZCr;6T?vpPSFRy?O|o$LAvR4&hksf%v^>#EZ@+b$?#MI>Qh~Mk>y8RXVP#<>@qLDXH*+DjVTG*4?%rkmWV%Oe& zhv*I|ISp0uh(|T%9OJQ8#PhV-L}e`(m3nJf1}p=X0n318z%pPNunbrRECc_02Fm^4 zcPmwX_y;Om_j_cqKg;v_u2?RYe`(!!JM!b?g)g6vUic>Z+Re4;Q)7|k$mh}3)dJl@ zmv_EP>Axo3*8Q(*E;xUs>Ry^IeMqgGUO|0ic_m3w$)7ImAzbugIC^n&a&>6aMzZ-| z@}jrt%u4c7a&@%x))vL;cB@u@G--8bvx>e&booj5Zu~lNLw4#S%3(J6Iz%pPN zunbrRECZGS%YbFTGGH073|Iz)0e*kTvIG80Cse~?Tf^R#rtl?tLCEhF`Ca_2pUUL} zoHN?g#<3nccC3}l`kgx2om@r7RmyWntF3M0TRV=nHoq7ys3UuxeC$vszmnAb%#kip zo_+^C#ED_u4?jUDQk>t%vhbKL)A2RM_Hlr6pOf6HELnkcqWcLt3m~} z%rU&UFsSOzQumI2Ga{WF03FW#fdQn}yS;A#K2 zJLN1J9pdADvLHV83J;3EMWd8@Ty(Q&w7*k)DBMeyWZx_Hwjv+*y}a+0Ww%i(+~{cw z@iplm`=)`X&9++L-zl5F)SZC(`dm+=$cL)7#(E*V|u@s`@;yM)h;K8mU_A#d&XZ1Kp|Dk7uurw=4WkXeC0% zdi$w)hk~QFtFY%GRqJC^u9xpqyp8f(>hhBkuWu($@on^#gK|8ws^{&iWOF-hb?v-K z@%B)&nif8B9`mz~cGX<@p5g%cEbq~=-grKuIOi9n9sS&c0klCp6OZNMyj?sO%PlE? z^vtoLrzc00KQVQDcxcK$K0bbO?390MXn1PO|NFjj4;#s8^EhuYulT&N+)u<~L5x7G z%w}}uPaY>Lp33+O`9z#jGE~Ip{9Ix#I}-~MoED^J{P|RZfamgg!Rbxx%FQpOgV;IJ zLC)w|SgA~q$jvMFd}hI&jpb*R8(+#$y3s+-)Vz?$0^>hK47*g4lW8VJw}Rp-!^Y02Quo&$Kg> zO{Wu?fZ4xqG3R%6Z+$W3={AcYtt#KU7_a)=3jQNx@Hr*vw8h^uRkFZg{lWT*bqfAN zl>IxcJ-}nV?GQY^w?RJerW2*Q$l$dWc&x{Rf{#ifkCE2|;4v;jcJ+Jm{l@=d~IBvh=?!cz&MAQa^qZRq6~G+&1vI9;^u- z^F;sk^Pds?ur!G4OIQH4cwWEi@v{_TPB2eefXE}^hn^&kE~|xvQLWNcRf~57??~dO zRj9UrN0`?`#`D;;IG$*uFmK~k*Gt4-rV7S`zp&uLjzKINRVgul1l}Nnuf@RQyQUkC z$q;26D(mr=DOQWe_e~`MilQtd7&rX)$zbl~=dN78@I6w2Cr85P4-5JSkDpMCQ-H^J zIK^(xuI3xB>Z6@&R8fn^b+ROQ2SCxlL4Q_<$Mr7UV*vH@mFZMkT@k#bSK=)a;PtIm zfUni~?P~K53LgCJqDtlv