pr 28
This commit is contained in:
parent
76660294d5
commit
4f442f3123
@ -131,10 +131,10 @@ impl<'a> BytecodeEmitter<'a> {
|
|||||||
InstrKind::BitXor => asm_instrs.push(Asm::Op(OpCode::BitXor, vec![])),
|
InstrKind::BitXor => asm_instrs.push(Asm::Op(OpCode::BitXor, vec![])),
|
||||||
InstrKind::Shl => asm_instrs.push(Asm::Op(OpCode::Shl, vec![])),
|
InstrKind::Shl => asm_instrs.push(Asm::Op(OpCode::Shl, vec![])),
|
||||||
InstrKind::Shr => asm_instrs.push(Asm::Op(OpCode::Shr, vec![])),
|
InstrKind::Shr => asm_instrs.push(Asm::Op(OpCode::Shr, vec![])),
|
||||||
InstrKind::GetLocal(slot) => {
|
InstrKind::LocalLoad { slot } => {
|
||||||
asm_instrs.push(Asm::Op(OpCode::GetLocal, vec![Operand::U32(*slot)]));
|
asm_instrs.push(Asm::Op(OpCode::GetLocal, vec![Operand::U32(*slot)]));
|
||||||
}
|
}
|
||||||
InstrKind::SetLocal(slot) => {
|
InstrKind::LocalStore { slot } => {
|
||||||
asm_instrs.push(Asm::Op(OpCode::SetLocal, vec![Operand::U32(*slot)]));
|
asm_instrs.push(Asm::Op(OpCode::SetLocal, vec![Operand::U32(*slot)]));
|
||||||
}
|
}
|
||||||
InstrKind::GetGlobal(slot) => {
|
InstrKind::GetGlobal(slot) => {
|
||||||
|
|||||||
@ -109,9 +109,9 @@ pub enum InstrKind {
|
|||||||
// --- Variable Access ---
|
// --- Variable Access ---
|
||||||
|
|
||||||
/// Retrieves a value from a local variable slot and pushes it onto the stack.
|
/// Retrieves a value from a local variable slot and pushes it onto the stack.
|
||||||
GetLocal(u32),
|
LocalLoad { slot: u32 },
|
||||||
/// Pops a value from the stack and stores it in a local variable slot.
|
/// Pops a value from the stack and stores it in a local variable slot.
|
||||||
SetLocal(u32),
|
LocalStore { slot: u32 },
|
||||||
/// Retrieves a value from a global variable slot and pushes it onto the stack.
|
/// Retrieves a value from a global variable slot and pushes it onto the stack.
|
||||||
GetGlobal(u32),
|
GetGlobal(u32),
|
||||||
/// Pops a value from the stack and stores it in a global variable slot.
|
/// Pops a value from the stack and stores it in a global variable slot.
|
||||||
@ -207,8 +207,8 @@ mod tests {
|
|||||||
InstrKind::BitXor,
|
InstrKind::BitXor,
|
||||||
InstrKind::Shl,
|
InstrKind::Shl,
|
||||||
InstrKind::Shr,
|
InstrKind::Shr,
|
||||||
InstrKind::GetLocal(0),
|
InstrKind::LocalLoad { slot: 0 },
|
||||||
InstrKind::SetLocal(0),
|
InstrKind::LocalStore { slot: 0 },
|
||||||
InstrKind::GetGlobal(0),
|
InstrKind::GetGlobal(0),
|
||||||
InstrKind::SetGlobal(0),
|
InstrKind::SetGlobal(0),
|
||||||
InstrKind::Jmp(Label("target".to_string())),
|
InstrKind::Jmp(Label("target".to_string())),
|
||||||
@ -266,10 +266,14 @@ mod tests {
|
|||||||
"Shl",
|
"Shl",
|
||||||
"Shr",
|
"Shr",
|
||||||
{
|
{
|
||||||
"GetLocal": 0
|
"LocalLoad": {
|
||||||
|
"slot": 0
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"SetLocal": 0
|
"LocalStore": {
|
||||||
|
"slot": 0
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"GetGlobal": 0
|
"GetGlobal": 0
|
||||||
@ -322,4 +326,21 @@ mod tests {
|
|||||||
]"#;
|
]"#;
|
||||||
assert_eq!(serialized, expected_json);
|
assert_eq!(serialized, expected_json);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_no_ref_leakage_in_instr_names() {
|
||||||
|
// Enforce the rule that "Ref" must never refer to HIP memory in ir_vm.
|
||||||
|
// The snapshot test above already locks the names, but this test
|
||||||
|
// explicitly asserts the absence of the "Ref" substring in HIP-related instructions.
|
||||||
|
let instructions = [
|
||||||
|
"GateLoad", "GateStore", "Alloc",
|
||||||
|
"GateBeginPeek", "GateEndPeek",
|
||||||
|
"GateBeginBorrow", "GateEndBorrow",
|
||||||
|
"GateBeginMutate", "GateEndMutate"
|
||||||
|
];
|
||||||
|
|
||||||
|
for name in instructions {
|
||||||
|
assert!(!name.contains("Ref"), "Instruction {} contains forbidden 'Ref' terminology", name);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -53,8 +53,8 @@ pub fn lower_function(core_func: &ir_core::Function) -> Result<ir_vm::Function>
|
|||||||
arg_count: *arg_count
|
arg_count: *arg_count
|
||||||
},
|
},
|
||||||
ir_core::Instr::HostCall(id) => ir_vm::InstrKind::Syscall(*id),
|
ir_core::Instr::HostCall(id) => ir_vm::InstrKind::Syscall(*id),
|
||||||
ir_core::Instr::GetLocal(slot) => ir_vm::InstrKind::GetLocal(*slot),
|
ir_core::Instr::GetLocal(slot) => ir_vm::InstrKind::LocalLoad { slot: *slot },
|
||||||
ir_core::Instr::SetLocal(slot) => ir_vm::InstrKind::SetLocal(*slot),
|
ir_core::Instr::SetLocal(slot) => ir_vm::InstrKind::LocalStore { slot: *slot },
|
||||||
ir_core::Instr::Pop => ir_vm::InstrKind::Pop,
|
ir_core::Instr::Pop => ir_vm::InstrKind::Pop,
|
||||||
ir_core::Instr::Dup => ir_vm::InstrKind::Dup,
|
ir_core::Instr::Dup => ir_vm::InstrKind::Dup,
|
||||||
ir_core::Instr::Add => ir_vm::InstrKind::Add,
|
ir_core::Instr::Add => ir_vm::InstrKind::Add,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user