Add Makefile by @neon, fix array typechecking during typeinference
This commit is contained in:
parent
bcad9b57fe
commit
28d632d51c
1
.gitignore
vendored
1
.gitignore
vendored
@ -8,3 +8,4 @@ main
|
||||
reid_src/*.o
|
||||
reid_src/*.ll
|
||||
reid_src/*.asm
|
||||
reid_src/*.out
|
||||
|
17
Makefile
Normal file
17
Makefile
Normal file
@ -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) $<
|
16
libtest.sh
16
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:
|
||||
|
@ -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();
|
||||
|
@ -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<TypeKind> {
|
||||
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<TypeKind> {
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
BIN
reid_src/array
Executable file
BIN
reid_src/array
Executable file
Binary file not shown.
38
test.ll
38
test.ll
@ -1,38 +0,0 @@
|
||||
; ModuleID = 'test'
|
||||
source_filename = "test"
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define ptr @array() {
|
||||
array:
|
||||
%array_alloca = alloca i16, i16 4, align 2
|
||||
%array_gep = getelementptr i16, ptr %array_alloca, i32 0
|
||||
store i16 10, ptr %array_gep, align 2
|
||||
%array_gep1 = getelementptr i16, ptr %array_alloca, i32 1
|
||||
store i16 15, ptr %array_gep1, align 2
|
||||
%array_gep2 = getelementptr i16, ptr %array_alloca, i32 2
|
||||
store i16 7, ptr %array_gep2, align 2
|
||||
%array_gep3 = getelementptr i16, ptr %array_alloca, i32 3
|
||||
store i16 9, ptr %array_gep3, align 2
|
||||
|
||||
%array_alloca4 = alloca ptr, i16 1, align 8
|
||||
%array_gep5 = getelementptr ptr, ptr %array_alloca4, i32 0
|
||||
store ptr %array_alloca, ptr %array_gep5, align 8
|
||||
ret ptr %array_alloca4
|
||||
}
|
||||
|
||||
define i16 @main() {
|
||||
main:
|
||||
%call = call ptr @array()
|
||||
%array_gep = getelementptr ptr, ptr %call, i32 0
|
||||
%load5 = load ptr, ptr %array_gep2, align 8
|
||||
%array_gep1 = getelementptr i16, ptr %load5, i32 3
|
||||
store i16 5, ptr %array_gep1, align 2
|
||||
|
||||
%array_gep2 = getelementptr ptr, ptr %call, i32 0
|
||||
%load = load ptr, ptr %array_gep2, align 8
|
||||
%array_gep3 = getelementptr i16, ptr %load, i32 3
|
||||
%load4 = load i16, ptr %array_gep3, align 2
|
||||
|
||||
ret i16 %load4
|
||||
}
|
Loading…
Reference in New Issue
Block a user