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,
)
| 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, |
no test coverage detected