Support bitfield access in struct Expression
This commit is contained in:
parent
4835e10241
commit
382673adbc
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue