Add GetGlobal "instruction"
This commit is contained in:
parent
140d963d9b
commit
ebe7fc8d75
@ -28,10 +28,10 @@ pub struct BlockValue(pub(crate) FunctionValue, pub(crate) usize);
|
||||
pub struct InstructionValue(pub(crate) BlockValue, pub(crate) usize);
|
||||
|
||||
#[derive(Debug, Clone, Hash, Copy, PartialEq, Eq)]
|
||||
pub struct ConstantValue(pub(crate) usize);
|
||||
pub struct ConstantValue(pub(crate) ModuleValue, pub(crate) usize);
|
||||
|
||||
#[derive(Clone, Hash, Copy, PartialEq, Eq)]
|
||||
pub struct GlobalValue(pub(crate) usize);
|
||||
#[derive(Debug, Clone, Hash, Copy, PartialEq, Eq)]
|
||||
pub struct GlobalValue(pub(crate) ModuleValue, pub(crate) usize);
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ModuleHolder {
|
||||
@ -194,7 +194,7 @@ impl Builder {
|
||||
unsafe {
|
||||
let mut modules = self.modules.borrow_mut();
|
||||
let module = modules.get_unchecked_mut(module.0);
|
||||
let value = ConstantValue(module.constants.len());
|
||||
let value = ConstantValue(module.value, module.constants.len());
|
||||
module.constants.push(ConstantValueHolder { value, kind });
|
||||
value
|
||||
}
|
||||
@ -209,7 +209,7 @@ impl Builder {
|
||||
unsafe {
|
||||
let mut modules = self.modules.borrow_mut();
|
||||
let module = modules.get_unchecked_mut(module.0);
|
||||
let value = GlobalValue(module.globals.len());
|
||||
let value = GlobalValue(module.value, module.globals.len());
|
||||
module.globals.push(GlobalValueHolder {
|
||||
value,
|
||||
name,
|
||||
@ -383,6 +383,24 @@ impl Builder {
|
||||
self.modules.clone()
|
||||
}
|
||||
|
||||
pub(crate) fn get_global_initializer(&self, value: GlobalValue) -> ConstantValue {
|
||||
unsafe {
|
||||
let modules = self.modules.borrow();
|
||||
let module = modules.get_unchecked(value.0.0);
|
||||
let global = module.globals.get_unchecked(value.1);
|
||||
global.initializer
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn get_const_kind(&self, value: ConstantValue) -> ConstValueKind {
|
||||
unsafe {
|
||||
let modules = self.modules.borrow();
|
||||
let module = modules.get_unchecked(value.0.0);
|
||||
let constant = module.constants.get_unchecked(value.1);
|
||||
constant.kind.clone()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn check_instruction(&self, instruction: &InstructionValue) -> CompileResult<()> {
|
||||
unsafe {
|
||||
match self.instr_data(&instruction).kind {
|
||||
@ -617,6 +635,7 @@ impl Builder {
|
||||
Err(ErrorKind::Null)
|
||||
}
|
||||
}
|
||||
Instr::GetGlobal(_) => Ok(()),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -768,6 +787,11 @@ impl InstructionValue {
|
||||
ShiftRightLogical(lhs, _) => lhs.get_type(builder),
|
||||
ShiftRightArithmetic(lhs, _) => lhs.get_type(builder),
|
||||
ShiftLeft(lhs, _) => lhs.get_type(builder),
|
||||
GetGlobal(global_value) => {
|
||||
let constant = builder.get_global_initializer(*global_value);
|
||||
let kind = builder.get_const_kind(constant);
|
||||
Ok(kind.get_type())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1052,6 +1052,7 @@ impl InstructionHolder {
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildShl(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
GetGlobal(global_value) => module.globals.get(global_value).unwrap().clone(),
|
||||
}
|
||||
};
|
||||
if let Some(record) = &self.record {
|
||||
|
@ -392,6 +392,7 @@ impl Debug for Instr {
|
||||
Instr::ShiftRightLogical(lhs, rhs) => fmt_binop(f, lhs, &">>l", rhs),
|
||||
Instr::ShiftRightArithmetic(lhs, rhs) => fmt_binop(f, lhs, &">>a", rhs),
|
||||
Instr::ShiftLeft(lhs, rhs) => fmt_binop(f, lhs, &"<<", rhs),
|
||||
Instr::GetGlobal(global_value) => write!(f, "global {:?}", global_value),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -276,6 +276,7 @@ impl Instr {
|
||||
Instr::ShiftRightLogical(..) => "lshr",
|
||||
Instr::ShiftRightArithmetic(..) => "ashr",
|
||||
Instr::ShiftLeft(..) => "shl",
|
||||
Instr::GetGlobal(global_value) => todo!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -373,6 +374,7 @@ pub enum CmpPredicate {
|
||||
pub enum Instr {
|
||||
Param(usize),
|
||||
Constant(ConstValueKind),
|
||||
GetGlobal(GlobalValue),
|
||||
|
||||
/// Add two integers
|
||||
Add(InstructionValue, InstructionValue),
|
||||
|
Loading…
Reference in New Issue
Block a user