Support bitfield access in struct Expression

This commit is contained in:
Guojie Luo 2022-03-31 21:59:00 +08:00
parent 4835e10241
commit 382673adbc
1 changed files with 18 additions and 17 deletions

View File

@ -100,35 +100,36 @@ impl Expression {
fn gen_reference_value(json: &JsonValue, context: &mut ModuleContext) -> Option<Value> {
let (symbol, range) = Self::gen_reference_call(json, context);
if range.is_some() {
warn!("FIXME: bitfield access at CST node '{}'", json);
}
if context.unit_ctx.data.is_some() {
let unit_ctx = &mut context.unit_ctx;
let raw_name_to_value = &mut unit_ctx.raw_name_to_value;
let raw_name_to_shadow = &unit_ctx.raw_name_to_shadow;
if raw_name_to_value.contains_key(&symbol) {
let value = raw_name_to_value[&symbol];
let mut builder = UnitContext::builder(&mut unit_ctx.data);
let bb_head = *unit_ctx.bb_head.last().unwrap();
builder.append_to(bb_head);
let value = if raw_name_to_value.contains_key(&symbol) {
let symbol_value = raw_name_to_value[&symbol];
let shadow = raw_name_to_shadow.get(&symbol).cloned();
let mut builder = UnitContext::builder(&mut unit_ctx.data);
let bb_head = *unit_ctx.bb_head.last().unwrap();
builder.append_to(bb_head);
Some(match shadow {
None => builder.ins().prb(value),
match shadow {
None => builder.ins().prb(symbol_value),
Some(s) => builder.ins().ld(s),
})
}
} else if context.param.contains_key(&symbol) {
let mut builder = UnitContext::builder(&mut unit_ctx.data);
let bb_head = *unit_ctx.bb_head.last().unwrap();
builder.append_to(bb_head);
Some(builder.ins().const_int(context.param[&symbol].clone()))
builder.ins().const_int(context.param[&symbol].clone())
} else {
panic!("unknown error at CST node {}", json);
};
if range.is_some() {
let base = range.unwrap().1;
let width = range.unwrap().0 - range.unwrap().1 + 1;
Some(builder.ins().ext_slice(value, base, width))
} else {
Some(value)
}
} else {
None