(&mut self, builder: &mut FunctionBuilder)
| 1892 | } |
| 1893 | |
| 1894 | fn build_variable_pool(&mut self, builder: &mut FunctionBuilder) -> Result<()> { |
| 1895 | let block = builder.current_block().unwrap(); |
| 1896 | |
| 1897 | // Define variables for the function signature |
| 1898 | let mut vars: Vec<_> = builder |
| 1899 | .func |
| 1900 | .signature |
| 1901 | .params |
| 1902 | .iter() |
| 1903 | .map(|param| param.value_type) |
| 1904 | .zip(builder.block_params(block).iter().copied()) |
| 1905 | .collect(); |
| 1906 | |
| 1907 | // Create a pool of vars that are going to be used in this function |
| 1908 | for _ in 0..self.param(&self.config.vars_per_function)? { |
| 1909 | let ty = self.u._type((&*self.isa).supports_simd())?; |
| 1910 | let value = self.generate_const(builder, ty)?; |
| 1911 | vars.push((ty, value)); |
| 1912 | } |
| 1913 | |
| 1914 | for (ty, value) in vars.into_iter() { |
| 1915 | let var = builder.declare_var(ty); |
| 1916 | |
| 1917 | // Randomly declare variables as needing a stack map. |
| 1918 | // We limit these to only types that have fewer than 16 bytes |
| 1919 | // since the stack map mechanism does not support larger types. |
| 1920 | if ty.bytes() <= 16 && self.u.arbitrary()? { |
| 1921 | builder.declare_var_needs_stack_map(var); |
| 1922 | } |
| 1923 | |
| 1924 | builder.def_var(var, value); |
| 1925 | |
| 1926 | self.resources |
| 1927 | .vars |
| 1928 | .entry(ty) |
| 1929 | .or_insert_with(Vec::new) |
| 1930 | .push(var); |
| 1931 | } |
| 1932 | |
| 1933 | Ok(()) |
| 1934 | } |
| 1935 | |
| 1936 | /// We generate a function in multiple stages: |
| 1937 | /// |
no test coverage detected