MCPcopy Create free account
hub / github.com/bytecodealliance/wasmtime / parse_basic_block

Method parse_basic_block

cranelift/reader/src/parser.rs:2041–2106  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

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)?;

Callers 1

parse_function_bodyMethod · 0.80

Calls 15

OkFunction · 0.85
match_blockMethod · 0.80
tokenMethod · 0.80
parse_block_paramsMethod · 0.80
optionalMethod · 0.80
match_tokenMethod · 0.80
optional_srclocMethod · 0.80
optional_debug_tagsMethod · 0.80
parse_inst_resultsMethod · 0.80
num_valuesMethod · 0.80

Tested by

no test coverage detected