(
pair: Pair<'_, Rule>,
banks: &mut PrimaryMap<RegBank, RegBankData>,
classes: &mut PrimaryMap<RegClass, RegClassData>,
regs: &mut PrimaryMap<PhysReg, PhysRegData>,
superclasses: &
| 261 | } |
| 262 | |
| 263 | fn parse_bank_def( |
| 264 | pair: Pair<'_, Rule>, |
| 265 | banks: &mut PrimaryMap<RegBank, RegBankData>, |
| 266 | classes: &mut PrimaryMap<RegClass, RegClassData>, |
| 267 | regs: &mut PrimaryMap<PhysReg, PhysRegData>, |
| 268 | superclasses: &mut SecondaryMap<RegClass, RegClassSet>, |
| 269 | ) -> Result<()> { |
| 270 | let span = pair.as_span(); |
| 271 | let mut top_level_class = None; |
| 272 | let mut stack_to_stack_class = None; |
| 273 | let mut spillslot_size = None; |
| 274 | for pair in pair.into_inner() { |
| 275 | match pair.as_rule() { |
| 276 | Rule::bank => { |
| 277 | parse_expected_entity(pair, banks.next_key())?; |
| 278 | } |
| 279 | Rule::top_level_class => { |
| 280 | if top_level_class.is_some() { |
| 281 | Err(custom_error(pair.as_span(), "duplicate attribute"))?; |
| 282 | } |
| 283 | let [class] = extract(pair, [Rule::class]); |
| 284 | top_level_class = Some(parse_entity(class)?); |
| 285 | } |
| 286 | Rule::stack_to_stack_class => { |
| 287 | if stack_to_stack_class.is_some() { |
| 288 | Err(custom_error(pair.as_span(), "duplicate attribute"))?; |
| 289 | } |
| 290 | let [class] = extract(pair, [Rule::class]); |
| 291 | stack_to_stack_class = Some(parse_entity(class)?); |
| 292 | } |
| 293 | Rule::spillslot_size => { |
| 294 | if spillslot_size.is_some() { |
| 295 | Err(custom_error(pair.as_span(), "duplicate attribute"))?; |
| 296 | } |
| 297 | let [number] = extract(pair, [Rule::number]); |
| 298 | let span = number.as_span(); |
| 299 | let size: u32 = parse_number(number)?; |
| 300 | if !size.is_power_of_two() { |
| 301 | Err(custom_error(span, "spillslot size must be a power of two"))?; |
| 302 | } |
| 303 | spillslot_size = Some(SpillSlotSize::new(size)); |
| 304 | } |
| 305 | Rule::class_def => { |
| 306 | parse_class_def(pair, banks.next_key(), classes, regs, superclasses)?; |
| 307 | } |
| 308 | _ => unreachable!(), |
| 309 | } |
| 310 | } |
| 311 | let Some(top_level_class) = top_level_class else { |
| 312 | Err(custom_error(span, "missing top_level_class attribute"))? |
| 313 | }; |
| 314 | let Some(stack_to_stack_class) = stack_to_stack_class else { |
| 315 | Err(custom_error(span, "missing stack_to_stack_class attribute"))? |
| 316 | }; |
| 317 | let Some(spillslot_size) = spillslot_size else { |
| 318 | Err(custom_error(span, "missing spillslot_size attribute"))? |
| 319 | }; |
| 320 | banks.push(RegBankData { |
no test coverage detected