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

Method parse_global_value_decl

cranelift/reader/src/parser.rs:1639–1717  ·  view source on GitHub ↗

Parse a global value decl. global-val-decl ::= * GlobalValue(gv) "=" global-val-desc global-val-desc ::= "vmctx" | "load" "." type "notrap" "aligned" GlobalValue(base) [offset] | "iadd_imm" "(" GlobalValue(base) ")" imm64 | "symbol" ["colocated"] name + imm64 | "dyn_scale_target_const" "." type

(
        &mut self,
        mem_flags: &mut MemFlagsSet,
    )

Source from the content-addressed store, hash-verified

1637 // | "dyn_scale_target_const" "." type
1638 //
1639 fn parse_global_value_decl(
1640 &mut self,
1641 mem_flags: &mut MemFlagsSet,
1642 ) -> ParseResult<(GlobalValue, GlobalValueData)> {
1643 let gv = self.match_gv("expected global value number: gv«n»")?;
1644
1645 self.match_token(Token::Equal, "expected '=' in global value declaration")?;
1646
1647 let data = match self.match_any_identifier("expected global value kind")? {
1648 "vmctx" => GlobalValueData::VMContext,
1649 "load" => {
1650 self.match_token(
1651 Token::Dot,
1652 "expected '.' followed by type in load global value decl",
1653 )?;
1654 let global_type = self.match_type("expected load type")?;
1655 let flags_data = self.optional_memflags()?;
1656 let base = self.match_gv("expected global value: gv«n»")?;
1657 let offset = self.optional_offset32()?;
1658
1659 if !(flags_data.notrap() && flags_data.aligned()) {
1660 return err!(self.loc, "global-value load must be notrap and aligned");
1661 }
1662 let flags = mem_flags.insert(flags_data).unwrap();
1663 GlobalValueData::Load {
1664 base,
1665 offset,
1666 global_type,
1667 flags,
1668 }
1669 }
1670 "iadd_imm" => {
1671 self.match_token(
1672 Token::Dot,
1673 "expected '.' followed by type in iadd_imm global value decl",
1674 )?;
1675 let global_type = self.match_type("expected iadd type")?;
1676 let base = self.match_gv("expected global value: gv«n»")?;
1677 self.match_token(
1678 Token::Comma,
1679 "expected ',' followed by rhs in iadd_imm global value decl",
1680 )?;
1681 let offset = self.match_imm64("expected iadd_imm immediate")?;
1682 GlobalValueData::IAddImm {
1683 base,
1684 offset,
1685 global_type,
1686 }
1687 }
1688 "symbol" => {
1689 let colocated = self.optional(Token::Identifier("colocated"));
1690 let tls = self.optional(Token::Identifier("tls"));
1691 let name = self.parse_external_name()?;
1692 let offset = self.optional_offset_imm64()?;
1693 GlobalValueData::Symbol {
1694 name,
1695 offset,
1696 colocated,

Callers 1

parse_preambleMethod · 0.80

Calls 15

OkFunction · 0.85
match_gvMethod · 0.80
match_tokenMethod · 0.80
match_any_identifierMethod · 0.80
match_typeMethod · 0.80
optional_memflagsMethod · 0.80
optional_offset32Method · 0.80
match_imm64Method · 0.80
optionalMethod · 0.80
parse_external_nameMethod · 0.80
optional_offset_imm64Method · 0.80
tokenMethod · 0.80

Tested by

no test coverage detected