MCPcopy Create free account
hub / github.com/Amanieu/regalloc3 / parse_bank_def

Function parse_bank_def

src/debug_utils/generic_reginfo/parse.rs:263–326  ·  view source on GitHub ↗
(
    pair: Pair<'_, Rule>,
    banks: &mut PrimaryMap<RegBank, RegBankData>,
    classes: &mut PrimaryMap<RegClass, RegClassData>,
    regs: &mut PrimaryMap<PhysReg, PhysRegData>,
    superclasses: &

Source from the content-addressed store, hash-verified

261}
262
263fn 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 {

Callers 1

parseMethod · 0.85

Calls 9

parse_class_defFunction · 0.85
next_keyMethod · 0.80
is_someMethod · 0.80
pushMethod · 0.80
parse_expected_entityFunction · 0.70
custom_errorFunction · 0.70
extractFunction · 0.70
parse_entityFunction · 0.70
parse_numberFunction · 0.70

Tested by

no test coverage detected