Actually finish array-support for lib
This commit is contained in:
		
							parent
							
								
									a2e52e0bd2
								
							
						
					
					
						commit
						d62d6e2845
					
				@ -3,6 +3,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use std::{cell::RefCell, rc::Rc};
 | 
					use std::{cell::RefCell, rc::Rc};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use llvm_sys::core::LLVMBuildArrayAlloca;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    BlockData, ConstValue, FunctionData, Instr, InstructionData, ModuleData, TerminatorKind, Type,
 | 
					    BlockData, ConstValue, FunctionData, Instr, InstructionData, ModuleData, TerminatorKind, Type,
 | 
				
			||||||
    util::match_types,
 | 
					    util::match_types,
 | 
				
			||||||
@ -277,14 +279,28 @@ impl Builder {
 | 
				
			|||||||
                        Err(())
 | 
					                        Err(())
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                Extract(list, idx) => {
 | 
					                Extract(arr, idx) => {
 | 
				
			||||||
                    let list_ty = list.get_type(&self)?;
 | 
					                    let arr_ty = arr.get_type(&self)?;
 | 
				
			||||||
                    if let Type::Array(_, len) = list_ty {
 | 
					                    if let Type::Array(_, len) = arr_ty {
 | 
				
			||||||
                        if len < idx { Ok(()) } else { Err(()) }
 | 
					                        if len < idx { Ok(()) } else { Err(()) }
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        Err(())
 | 
					                        Err(())
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                ArrayAlloca(_, _) => Ok(()),
 | 
				
			||||||
 | 
					                Insert(arr, idx, val) => {
 | 
				
			||||||
 | 
					                    let arr_ty = arr.get_type(&self)?;
 | 
				
			||||||
 | 
					                    let val_ty = val.get_type(&self)?;
 | 
				
			||||||
 | 
					                    if let Type::Array(elem_ty, len) = arr_ty {
 | 
				
			||||||
 | 
					                        if val_ty == *elem_ty && len < idx {
 | 
				
			||||||
 | 
					                            Ok(())
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            Err(())
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        Err(())
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -351,6 +367,10 @@ impl InstructionValue {
 | 
				
			|||||||
                    Ok(_) => Err(()),
 | 
					                    Ok(_) => Err(()),
 | 
				
			||||||
                    Err(_) => Err(()),
 | 
					                    Err(_) => Err(()),
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
 | 
					                ArrayAlloca(ty, len_value) => {
 | 
				
			||||||
 | 
					                    Ok(Type::Array(Box::new(ty.clone()), len_value.clone()))
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                Insert(_, _, val) => val.get_type(builder),
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -371,10 +391,15 @@ impl ConstValue {
 | 
				
			|||||||
            ConstValue::U64(_) => U64,
 | 
					            ConstValue::U64(_) => U64,
 | 
				
			||||||
            ConstValue::U128(_) => U128,
 | 
					            ConstValue::U128(_) => U128,
 | 
				
			||||||
            ConstValue::Bool(_) => Bool,
 | 
					            ConstValue::Bool(_) => Bool,
 | 
				
			||||||
            ConstValue::ConstArray(arr) => Array(
 | 
					            // ConstValue::Array(arr) => Array(
 | 
				
			||||||
                Box::new(arr.iter().map(|a| a.get_type()).next().unwrap_or(Void)),
 | 
					            //     Box::new(
 | 
				
			||||||
                arr.len() as u32,
 | 
					            //         arr.iter()
 | 
				
			||||||
            ),
 | 
					            //             .map(|a| a.get_type(builder).unwrap())
 | 
				
			||||||
 | 
					            //             .next()
 | 
				
			||||||
 | 
					            //             .unwrap_or(Void),
 | 
				
			||||||
 | 
					            //     ),
 | 
				
			||||||
 | 
					            //     arr.len() as u32,
 | 
				
			||||||
 | 
					            // ),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -355,6 +355,22 @@ impl InstructionHolder {
 | 
				
			|||||||
                    *idx as u32,
 | 
					                    *idx as u32,
 | 
				
			||||||
                    c"extract".as_ptr(),
 | 
					                    c"extract".as_ptr(),
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
 | 
					                ArrayAlloca(ty, len) => {
 | 
				
			||||||
 | 
					                    let array_len = ConstValue::U16(*len as u16).as_llvm(module.context_ref);
 | 
				
			||||||
 | 
					                    LLVMBuildArrayAlloca(
 | 
				
			||||||
 | 
					                        module.builder_ref,
 | 
				
			||||||
 | 
					                        ty.as_llvm(module.context_ref),
 | 
				
			||||||
 | 
					                        array_len,
 | 
				
			||||||
 | 
					                        c"array_alloca".as_ptr(),
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                Insert(arr, idx, val) => LLVMBuildInsertValue(
 | 
				
			||||||
 | 
					                    module.builder_ref,
 | 
				
			||||||
 | 
					                    module.values.get(arr).unwrap().value_ref,
 | 
				
			||||||
 | 
					                    module.values.get(val).unwrap().value_ref,
 | 
				
			||||||
 | 
					                    *idx,
 | 
				
			||||||
 | 
					                    c"insert".as_ptr(),
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        LLVMValue {
 | 
					        LLVMValue {
 | 
				
			||||||
@ -433,24 +449,26 @@ impl ConstValue {
 | 
				
			|||||||
                ConstValue::U32(val) => LLVMConstInt(t, *val as u64, 1),
 | 
					                ConstValue::U32(val) => LLVMConstInt(t, *val as u64, 1),
 | 
				
			||||||
                ConstValue::U64(val) => LLVMConstInt(t, *val as u64, 1),
 | 
					                ConstValue::U64(val) => LLVMConstInt(t, *val as u64, 1),
 | 
				
			||||||
                ConstValue::U128(val) => LLVMConstInt(t, *val as u64, 1),
 | 
					                ConstValue::U128(val) => LLVMConstInt(t, *val as u64, 1),
 | 
				
			||||||
                ConstValue::ConstArray(const_values) => {
 | 
					                //     ConstValue::Array(const_values) => {
 | 
				
			||||||
                    let elem_ty = const_values
 | 
					                //         let elem_ty = const_values
 | 
				
			||||||
                        .iter()
 | 
					                //             .iter()
 | 
				
			||||||
                        .map(|e| e.get_type())
 | 
					                //             .map(|e| e.get_type(builder))
 | 
				
			||||||
                        .next()
 | 
					                //             .next()
 | 
				
			||||||
                        .unwrap_or(Type::Void);
 | 
					                //             .unwrap_or(Ok(Type::Void))
 | 
				
			||||||
 | 
					                //             .unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    let mut elems = const_values
 | 
					                //         let mut elems = const_values
 | 
				
			||||||
                        .iter()
 | 
					                //             .iter()
 | 
				
			||||||
                        .map(|e| e.as_llvm(context))
 | 
					                //             .map(|e| e.as_llvm(context))
 | 
				
			||||||
                        .collect::<Vec<_>>();
 | 
					                //             .collect::<Vec<_>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    LLVMConstArray(
 | 
					                //         LLVMConstArray(
 | 
				
			||||||
                        elem_ty.as_llvm(context),
 | 
					                //             elem_ty.as_llvm(context),
 | 
				
			||||||
                        elems.as_mut_ptr(),
 | 
					                //             elems.as_mut_ptr(),
 | 
				
			||||||
                        elems.len() as u32,
 | 
					                //             elems.len() as u32,
 | 
				
			||||||
                    )
 | 
					                //         )
 | 
				
			||||||
                }
 | 
					                //     }
 | 
				
			||||||
 | 
					                // }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -101,6 +101,10 @@ impl Debug for Instr {
 | 
				
			|||||||
            Instr::Load(val, ty) => write!(f, "load<{:?}>({:?})", ty, val),
 | 
					            Instr::Load(val, ty) => write!(f, "load<{:?}>({:?})", ty, val),
 | 
				
			||||||
            Instr::Store(ptr, val) => write!(f, "store({:?} = {:?})", ptr, val),
 | 
					            Instr::Store(ptr, val) => write!(f, "store({:?} = {:?})", ptr, val),
 | 
				
			||||||
            Instr::Extract(instruction_value, idx) => fmt_index(f, instruction_value, idx),
 | 
					            Instr::Extract(instruction_value, idx) => fmt_index(f, instruction_value, idx),
 | 
				
			||||||
 | 
					            Instr::ArrayAlloca(ty, instruction_value) => {
 | 
				
			||||||
 | 
					                write!(f, "array_alloca<{:?}>({:?})", ty, instruction_value)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Instr::Insert(arr, idx, val) => write!(f, "{:?}[{}] = {:?}", arr, idx, val),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -177,6 +177,8 @@ pub enum Instr {
 | 
				
			|||||||
    Alloca(String, Type),
 | 
					    Alloca(String, Type),
 | 
				
			||||||
    Load(InstructionValue, Type),
 | 
					    Load(InstructionValue, Type),
 | 
				
			||||||
    Store(InstructionValue, InstructionValue),
 | 
					    Store(InstructionValue, InstructionValue),
 | 
				
			||||||
 | 
					    ArrayAlloca(Type, u32),
 | 
				
			||||||
 | 
					    Insert(InstructionValue, u32, InstructionValue),
 | 
				
			||||||
    Extract(InstructionValue, u32),
 | 
					    Extract(InstructionValue, u32),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Integer Comparison
 | 
					    /// Integer Comparison
 | 
				
			||||||
@ -216,7 +218,6 @@ pub enum ConstValue {
 | 
				
			|||||||
    U64(u64),
 | 
					    U64(u64),
 | 
				
			||||||
    U128(u128),
 | 
					    U128(u128),
 | 
				
			||||||
    Bool(bool),
 | 
					    Bool(bool),
 | 
				
			||||||
    ConstArray(Vec<ConstValue>),
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Clone, Hash)]
 | 
					#[derive(Clone, Hash)]
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user