Parse a basic block, add contents to `ctx`. extended-basic-block ::= * block-header { instruction } block-header ::= Block(block) [block-params] [block-flags] ":" block-flags ::= [Cold]
(&mut self, ctx: &mut Context)
| 2039 | // block-flags ::= [Cold] |
| 2040 | // |
| 2041 | fn parse_basic_block(&mut self, ctx: &mut Context) -> ParseResult<()> { |
| 2042 | // Collect comments for the next block. |
| 2043 | self.start_gathering_comments(); |
| 2044 | |
| 2045 | let block_num = self.match_block("expected block header")?; |
| 2046 | let block = ctx.add_block(block_num, self.loc)?; |
| 2047 | |
| 2048 | if block_num.as_u32() >= MAX_BLOCKS_IN_A_FUNCTION { |
| 2049 | return Err(self.error("too many blocks")); |
| 2050 | } |
| 2051 | |
| 2052 | if self.token() == Some(Token::LPar) { |
| 2053 | self.parse_block_params(ctx, block)?; |
| 2054 | } |
| 2055 | |
| 2056 | if self.optional(Token::Cold) { |
| 2057 | ctx.set_cold_block(block); |
| 2058 | } |
| 2059 | |
| 2060 | self.match_token(Token::Colon, "expected ':' after block parameters")?; |
| 2061 | |
| 2062 | // Collect any trailing comments. |
| 2063 | self.token(); |
| 2064 | self.claim_gathered_comments(block); |
| 2065 | |
| 2066 | // extended-basic-block ::= block-header * { instruction } |
| 2067 | while match self.token() { |
| 2068 | Some(Token::Value(_)) |
| 2069 | | Some(Token::Identifier(_)) |
| 2070 | | Some(Token::LBracket) |
| 2071 | | Some(Token::SourceLoc(_)) |
| 2072 | | Some(Token::LAngle) => true, |
| 2073 | _ => false, |
| 2074 | } { |
| 2075 | let srcloc = self.optional_srcloc()?; |
| 2076 | |
| 2077 | let debug_tags = self.optional_debug_tags()?; |
| 2078 | |
| 2079 | // We need to parse instruction results here because they are shared |
| 2080 | // between the parsing of value aliases and the parsing of instructions. |
| 2081 | // |
| 2082 | // inst-results ::= Value(v) { "," Value(v) } |
| 2083 | let results = self.parse_inst_results()?; |
| 2084 | |
| 2085 | for result in &results { |
| 2086 | while ctx.function.dfg.num_values() <= result.index() { |
| 2087 | ctx.function.dfg.make_invalid_value_for_parser(); |
| 2088 | } |
| 2089 | } |
| 2090 | |
| 2091 | match self.token() { |
| 2092 | Some(Token::Arrow) => { |
| 2093 | self.consume(); |
| 2094 | self.parse_value_alias(&results, ctx)?; |
| 2095 | } |
| 2096 | Some(Token::Equal) => { |
| 2097 | self.consume(); |
| 2098 | self.parse_instruction(&results, srcloc, debug_tags, ctx, block)?; |
no test coverage detected