To protect your data, the CISO officer has suggested users to enable 2FA as soon as possible.
Currently 2.7% of users enabled 2FA.

Commit fad24db1 authored by Yi Lin's avatar Yi Lin
Browse files

Merge branch 'isaac_working' into 'develop'

Isaac working

See merge request !29
parents 3ef34581 51cbaf3b
...@@ -9,6 +9,7 @@ before_script: ...@@ -9,6 +9,7 @@ before_script:
- export ZEBU_BUILD=release - export ZEBU_BUILD=release
- export CARGO_HOME=.cargo - export CARGO_HOME=.cargo
- export CC=clang - export CC=clang
- export LD_LIBRARY_PATH=$MU_ZEBU/target/$ZEBU_BUILD:$LD_LIBRARY_PATH
- source /home/gitlab-runner/ci/bin/activate - source /home/gitlab-runner/ci/bin/activate
build: build:
...@@ -121,7 +122,7 @@ testjit:rpython: ...@@ -121,7 +122,7 @@ testjit:rpython:
- git checkout mu-rewrite - git checkout mu-rewrite
- git apply pypy.patch - git apply pypy.patch
- cd $CI_PROJECT_DIR/tests/test_jit - cd $CI_PROJECT_DIR/tests/test_jit
- MU_LOG_LEVEL=info LD_LIBRARY_PATH=./emit RUST_BACKTRACE=1 PYTHONPATH=mu-client-pypy pytest test_rpython*.py -v --color=yes - MU_LOG_LEVEL=info LD_LIBRARY_PATH=./emit:$LD_LIBRARY_PATH RUST_BACKTRACE=1 PYTHONPATH=mu-client-pypy pytest test_rpython*.py -v --color=yes
testjit:som: testjit:som:
stage: test stage: test
...@@ -135,7 +136,7 @@ testjit:som: ...@@ -135,7 +136,7 @@ testjit:som:
- git checkout mu-rewrite - git checkout mu-rewrite
- git apply pypy.patch - git apply pypy.patch
- cd $CI_PROJECT_DIR/tests/test_jit - cd $CI_PROJECT_DIR/tests/test_jit
- MU_LOG_LEVEL=info LD_LIBRARY_PATH=./emit RUST_BACKTRACE=1 PYTHONPATH=mu-client-pypy:RPySOM/src RPYSOM=RPySOM pytest test_som.py -v --color=yes - MU_LOG_LEVEL=info LD_LIBRARY_PATH=./emit:$LD_LIBRARY_PATH RUST_BACKTRACE=1 PYTHONPATH=mu-client-pypy:RPySOM/src RPYSOM=RPySOM pytest test_som.py -v --color=yes
mubench: mubench:
stage: mubench stage: mubench
......
...@@ -37,8 +37,8 @@ gcc = "*" ...@@ -37,8 +37,8 @@ gcc = "*"
mu_ast = {path = "src/ast"} mu_ast = {path = "src/ast"}
mu_utils = {path = "src/utils"} mu_utils = {path = "src/utils"}
#mu_gc = {path = "src/gc"} #mu_gc = {path = "src/gc"}
rodal = { git = "https://gitlab.anu.edu.au/mu/rodal", version = ">= 0.0.5" } rodal = { git = "https://gitlab.anu.edu.au/mu/rodal", branch = "new", version = "^0.1.13" }
#rodal = { path = "../rodal_test/rodal", version = ">= 0.0.5" } #rodal = { path = "./rodal", version = "*" }
libc="*" libc="*"
field-offset = "*" field-offset = "*"
......
...@@ -25,6 +25,6 @@ mu_utils = {path = "../utils"} ...@@ -25,6 +25,6 @@ mu_utils = {path = "../utils"}
lazy_static = "*" lazy_static = "*"
log = "*" log = "*"
simple_logger = "*" simple_logger = "*"
rodal = { git = "https://gitlab.anu.edu.au/mu/rodal", version = ">= 0.0.5" }
regex = "*" regex = "*"
#rodal = { path = "../../../rodal_test/rodal", version = ">= 0.0.5" } rodal = { git = "https://gitlab.anu.edu.au/mu/rodal", branch = "new", version = "^0.1.13" }
#rodal = { path = "../../rodal", version = "*" }
...@@ -22,21 +22,22 @@ use utils::LinkedHashSet; ...@@ -22,21 +22,22 @@ use utils::LinkedHashSet;
use std; use std;
use std::fmt; use std::fmt;
pub use std::sync::Arc;
use std::default; use std::default;
use std::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering}; use std::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
pub type WPID = usize; pub type WPID = usize;
pub type MuID = usize; pub type MuID = usize;
pub type MuName = String; pub type MuName = Arc<String>;
pub type CName = MuName; pub type CName = MuName;
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub fn Mu(str: &'static str) -> MuName { pub fn Mu(str: &'static str) -> MuName {
str.to_string() Arc::new(str.to_string())
} }
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub fn C(str: &'static str) -> CName { pub fn C(str: &'static str) -> CName {
str.to_string() Arc::new(str.to_string())
} }
pub type OpIndex = usize; pub type OpIndex = usize;
...@@ -134,6 +135,7 @@ impl fmt::Display for MuFunction { ...@@ -134,6 +135,7 @@ impl fmt::Display for MuFunction {
// FIXME: currently part of compilation information is also stored in this data structure // FIXME: currently part of compilation information is also stored in this data structure
// we should move them (see Issue #18) // we should move them (see Issue #18)
rodal_named!(MuFunctionVersion);
pub struct MuFunctionVersion { pub struct MuFunctionVersion {
pub hdr: MuEntityHeader, pub hdr: MuEntityHeader,
...@@ -460,7 +462,7 @@ impl FunctionContent { ...@@ -460,7 +462,7 @@ impl FunctionContent {
} }
} }
pub fn get_block_by_name(&self, name: String) -> &Block { pub fn get_block_by_name(&self, name: MuName) -> &Block {
for block in self.blocks.values() { for block in self.blocks.values() {
if block.name() == name { if block.name() == name {
return block; return block;
...@@ -1466,7 +1468,7 @@ pub fn is_valid_c_identifier(name: &MuName) -> bool { ...@@ -1466,7 +1468,7 @@ pub fn is_valid_c_identifier(name: &MuName) -> bool {
/// changes name to mangled name /// changes name to mangled name
/// This will always return a valid C identifier /// This will always return a valid C identifier
pub fn mangle_name(name: MuName) -> MuName { pub fn mangle_name(name: MuName) -> String {
let name = name.replace('@', ""); let name = name.replace('@', "");
if name.starts_with("__mu_") { if name.starts_with("__mu_") {
// TODO: Get rid of this, since it will be triggered if a client provides a name // TODO: Get rid of this, since it will be triggered if a client provides a name
...@@ -1488,7 +1490,7 @@ pub fn mangle_name(name: MuName) -> MuName { ...@@ -1488,7 +1490,7 @@ pub fn mangle_name(name: MuName) -> MuName {
/// demangles a Mu name /// demangles a Mu name
// WARNING: This only reverses mangle_name above when no warning is issued) // WARNING: This only reverses mangle_name above when no warning is issued)
pub fn demangle_name(mut name: MuName) -> MuName { pub fn demangle_name(mut name: String) -> MuName {
let name = if cfg!(target_os = "macos") && name.starts_with("___mu_") { let name = if cfg!(target_os = "macos") && name.starts_with("___mu_") {
name.split_off(1) name.split_off(1)
} else { } else {
...@@ -1507,13 +1509,13 @@ pub fn demangle_name(mut name: MuName) -> MuName { ...@@ -1507,13 +1509,13 @@ pub fn demangle_name(mut name: MuName) -> MuName {
.replace("Zh", "-") .replace("Zh", "-")
.replace("Zd", ".") .replace("Zd", ".")
.replace("ZZ", "Z"); .replace("ZZ", "Z");
name Arc::new(name)
} }
extern crate regex; extern crate regex;
/// identifies mu names and demangles them /// identifies mu names and demangles them
pub fn demangle_text(text: String) -> String { pub fn demangle_text(text: &String) -> String {
use self::regex::Regex; use self::regex::Regex;
lazy_static!{ lazy_static!{
...@@ -1539,14 +1541,14 @@ impl MuEntityHeader { ...@@ -1539,14 +1541,14 @@ impl MuEntityHeader {
pub fn unnamed(id: MuID) -> MuEntityHeader { pub fn unnamed(id: MuID) -> MuEntityHeader {
MuEntityHeader { MuEntityHeader {
id: id, id: id,
name: format!("#{}", id) name: Arc::new(format!("#{}", id))
} }
} }
pub fn named(id: MuID, name: MuName) -> MuEntityHeader { pub fn named(id: MuID, name: MuName) -> MuEntityHeader {
MuEntityHeader { MuEntityHeader {
id: id, id: id,
name: name.replace('@', "") name: Arc::new(name.replace('@', ""))
} }
} }
...@@ -1559,7 +1561,7 @@ impl MuEntityHeader { ...@@ -1559,7 +1561,7 @@ impl MuEntityHeader {
} }
/// an abbreviate (easy reading) version of the name /// an abbreviate (easy reading) version of the name
fn abbreviate_name(&self) -> MuName { fn abbreviate_name(&self) -> String {
let split: Vec<&str> = self.name.split('.').collect(); let split: Vec<&str> = self.name.split('.').collect();
let mut ret = "".to_string(); let mut ret = "".to_string();
...@@ -1580,7 +1582,7 @@ impl MuEntityHeader { ...@@ -1580,7 +1582,7 @@ impl MuEntityHeader {
pub fn clone_with_id(&self, new_id: MuID) -> MuEntityHeader { pub fn clone_with_id(&self, new_id: MuID) -> MuEntityHeader {
let mut clone = self.clone(); let mut clone = self.clone();
clone.id = new_id; clone.id = new_id;
clone.name = format!("{}-#{}", clone.name, clone.id); clone.name = Arc::new(format!("{}-#{}", clone.name, clone.id));
clone clone
} }
} }
......
...@@ -105,7 +105,7 @@ impl ASMCode { ...@@ -105,7 +105,7 @@ impl ASMCode {
false false
} }
fn get_block_by_inst(&self, inst: usize) -> (&String, &ASMBlock) { fn get_block_by_inst(&self, inst: usize) -> (&MuName, &ASMBlock) {
for (name, block) in self.blocks.iter() { for (name, block) in self.blocks.iter() {
if inst >= block.start_inst && inst < block.end_inst { if inst >= block.start_inst && inst < block.end_inst {
return (name, block); return (name, block);
...@@ -693,7 +693,7 @@ impl MachineCode for ASMCode { ...@@ -693,7 +693,7 @@ impl MachineCode for ASMCode {
let asm = &mut self.code[inst]; let asm = &mut self.code[inst];
let inst = String::from(asm.code.split_whitespace().next().unwrap()); let inst = String::from(asm.code.split_whitespace().next().unwrap());
asm.code = format!("{} {}", inst, mangle_name(String::from(new_dest))); asm.code = format!("{} {}", inst, mangle_name(Arc::new(new_dest.to_string())));
asm.succs.clear(); asm.succs.clear();
asm.succs.push(succ); asm.succs.push(succ);
} }
...@@ -816,7 +816,7 @@ impl MachineCode for ASMCode { ...@@ -816,7 +816,7 @@ impl MachineCode for ASMCode {
trace!( trace!(
"#{}\t{:30}\t\tdefine: {:?}\tuses: {:?}\tpred: {:?}\tsucc: {:?}", "#{}\t{:30}\t\tdefine: {:?}\tuses: {:?}\tpred: {:?}\tsucc: {:?}",
i, i,
demangle_text(self.code[i].code.clone()), demangle_text(&self.code[i].code),
self.get_inst_reg_defines(i), self.get_inst_reg_defines(i),
self.get_inst_reg_uses(i), self.get_inst_reg_uses(i),
self.code[i].preds, self.code[i].preds,
...@@ -825,26 +825,26 @@ impl MachineCode for ASMCode { ...@@ -825,26 +825,26 @@ impl MachineCode for ASMCode {
} }
fn get_ir_block_livein(&self, block: &str) -> Option<&Vec<MuID>> { fn get_ir_block_livein(&self, block: &str) -> Option<&Vec<MuID>> {
match self.blocks.get(block) { match self.blocks.get(&block.to_string()) {
Some(ref block) => Some(&block.livein), Some(ref block) => Some(&block.livein),
None => None None => None
} }
} }
fn get_ir_block_liveout(&self, block: &str) -> Option<&Vec<MuID>> { fn get_ir_block_liveout(&self, block: &str) -> Option<&Vec<MuID>> {
match self.blocks.get(block) { match self.blocks.get(&block.to_string()) {
Some(ref block) => Some(&block.liveout), Some(ref block) => Some(&block.liveout),
None => None None => None
} }
} }
fn set_ir_block_livein(&mut self, block: &str, set: Vec<MuID>) { fn set_ir_block_livein(&mut self, block: &str, set: Vec<MuID>) {
let block = self.blocks.get_mut(block).unwrap(); let block = self.blocks.get_mut(&block.to_string()).unwrap();
block.livein = set; block.livein = set;
} }
fn set_ir_block_liveout(&mut self, block: &str, set: Vec<MuID>) { fn set_ir_block_liveout(&mut self, block: &str, set: Vec<MuID>) {
let block = self.blocks.get_mut(block).unwrap(); let block = self.blocks.get_mut(&block.to_string()).unwrap();
block.liveout = set; block.liveout = set;
} }
...@@ -857,7 +857,7 @@ impl MachineCode for ASMCode { ...@@ -857,7 +857,7 @@ impl MachineCode for ASMCode {
} }
fn get_block_range(&self, block: &str) -> Option<ops::Range<usize>> { fn get_block_range(&self, block: &str) -> Option<ops::Range<usize>> {
match self.blocks.get(block) { match self.blocks.get(&block.to_string()) {
Some(ref block) => Some(block.start_inst..block.end_inst), Some(ref block) => Some(block.start_inst..block.end_inst),
None => None None => None
} }
...@@ -1000,10 +1000,10 @@ pub struct ASMCodeGen { ...@@ -1000,10 +1000,10 @@ pub struct ASMCodeGen {
const REG_PLACEHOLDER_LEN: usize = 5; const REG_PLACEHOLDER_LEN: usize = 5;
lazy_static! { lazy_static! {
pub static ref REG_PLACEHOLDER : String = { pub static ref REG_PLACEHOLDER : MuName = {
let blank_spaces = [' ' as u8; REG_PLACEHOLDER_LEN]; let blank_spaces = [' ' as u8; REG_PLACEHOLDER_LEN];
format!("{}", str::from_utf8(&blank_spaces).unwrap()) Arc::new(format!("{}", str::from_utf8(&blank_spaces).unwrap()))
}; };
} }
...@@ -1033,7 +1033,7 @@ impl ASMCodeGen { ...@@ -1033,7 +1033,7 @@ impl ASMCodeGen {
} }
fn add_asm_symbolic(&mut self, code: String) { fn add_asm_symbolic(&mut self, code: String) {
trace_emit!("{}", demangle_text(code.clone())); trace_emit!("{}", demangle_text(&code));
self.cur_mut().code.push(ASMInst::symbolic(code)); self.cur_mut().code.push(ASMInst::symbolic(code));
} }
...@@ -1098,7 +1098,7 @@ impl ASMCodeGen { ...@@ -1098,7 +1098,7 @@ impl ASMCodeGen {
target: ASMBranchTarget, target: ASMBranchTarget,
spill_info: Option<SpillMemInfo> spill_info: Option<SpillMemInfo>
) { ) {
trace!("asm: {}", demangle_text(code.clone())); trace!("asm: {}", demangle_text(&code));
trace!(" defines: {:?}", defines); trace!(" defines: {:?}", defines);
trace!(" uses: {:?}", uses); trace!(" uses: {:?}", uses);
trace!(" target: {:?}", target); trace!(" target: {:?}", target);
...@@ -1274,7 +1274,7 @@ impl ASMCodeGen { ...@@ -1274,7 +1274,7 @@ impl ASMCodeGen {
format!("{}", op.name()) format!("{}", op.name())
} else { } else {
// virtual register, use place holder // virtual register, use place holder
REG_PLACEHOLDER.clone() (**REG_PLACEHOLDER).clone()
} }
} }
...@@ -2119,7 +2119,7 @@ impl ASMCodeGen { ...@@ -2119,7 +2119,7 @@ impl ASMCodeGen {
fn internal_call( fn internal_call(
&mut self, &mut self,
callsite: Option<String>, callsite: Option<MuName>,
code: String, code: String,
pe: Option<MuName>, pe: Option<MuName>,
args: Vec<P<Value>>, args: Vec<P<Value>>,
...@@ -2192,8 +2192,8 @@ impl CodeGenerator for ASMCodeGen { ...@@ -2192,8 +2192,8 @@ impl CodeGenerator for ASMCodeGen {
self.add_asm_symbolic(format!(".type {}, @function", func_symbol.clone())); self.add_asm_symbolic(format!(".type {}, @function", func_symbol.clone()));
self.add_asm_symbolic(format!("{}:", func_symbol.clone())); self.add_asm_symbolic(format!("{}:", func_symbol.clone()));
if is_valid_c_identifier(&func_name) { if is_valid_c_identifier(&func_name) {
self.add_asm_symbolic(directive_globl(func_name.clone())); self.add_asm_symbolic(directive_globl((*func_name).clone()));
self.add_asm_symbolic(directive_equiv(func_name.clone(), func_symbol.clone())); self.add_asm_symbolic(directive_equiv((*func_name).clone(), func_symbol.clone()));
} }
ValueLocation::Relocatable(RegGroup::GPR, func_name) ValueLocation::Relocatable(RegGroup::GPR, func_name)
...@@ -2204,9 +2204,9 @@ impl CodeGenerator for ASMCodeGen { ...@@ -2204,9 +2204,9 @@ impl CodeGenerator for ASMCodeGen {
func_name: MuName func_name: MuName
) -> (Box<MachineCode + Sync + Send>, ValueLocation) { ) -> (Box<MachineCode + Sync + Send>, ValueLocation) {
let func_end = { let func_end = {
let mut symbol = func_name.clone(); let mut symbol = (*func_name).clone();
symbol.push_str(":end"); symbol.push_str(":end");
symbol Arc::new(symbol)
}; };
let func_symbol = mangle_name(func_name.clone()); let func_symbol = mangle_name(func_name.clone());
let func_end_sym = mangle_name(func_end.clone()); let func_end_sym = mangle_name(func_end.clone());
...@@ -2229,8 +2229,8 @@ impl CodeGenerator for ASMCodeGen { ...@@ -2229,8 +2229,8 @@ impl CodeGenerator for ASMCodeGen {
fn start_code_sequence(&mut self) { fn start_code_sequence(&mut self) {
self.cur = Some(Box::new(ASMCode { self.cur = Some(Box::new(ASMCode {
name: "snippet".to_string(), name: Arc::new("snippet".to_string()),
entry: "none".to_string(), entry: Arc::new("none".to_string()),
code: vec![], code: vec![],
blocks: linked_hashmap!{}, blocks: linked_hashmap!{},
frame_size_patchpoints: vec![] frame_size_patchpoints: vec![]
...@@ -2401,7 +2401,7 @@ impl CodeGenerator for ASMCodeGen { ...@@ -2401,7 +2401,7 @@ impl CodeGenerator for ASMCodeGen {
fn emit_bl( fn emit_bl(
&mut self, &mut self,
callsite: Option<String>, callsite: Option<MuName>,
func: MuName, func: MuName,
pe: Option<MuName>, pe: Option<MuName>,
args: Vec<P<Value>>, args: Vec<P<Value>>,
...@@ -2428,7 +2428,7 @@ impl CodeGenerator for ASMCodeGen { ...@@ -2428,7 +2428,7 @@ impl CodeGenerator for ASMCodeGen {
fn emit_blr( fn emit_blr(
&mut self, &mut self,
callsite: Option<String>, callsite: Option<MuName>,
func: Reg, func: Reg,
pe: Option<MuName>, pe: Option<MuName>,
args: Vec<P<Value>>, args: Vec<P<Value>>,
...@@ -2461,7 +2461,7 @@ impl CodeGenerator for ASMCodeGen { ...@@ -2461,7 +2461,7 @@ impl CodeGenerator for ASMCodeGen {
fn emit_b_call( fn emit_b_call(
&mut self, &mut self,
callsite: Option<String>, callsite: Option<MuName>,
func: MuName, func: MuName,
pe: Option<MuName>, pe: Option<MuName>,
args: Vec<P<Value>>, args: Vec<P<Value>>,
...@@ -2516,7 +2516,7 @@ impl CodeGenerator for ASMCodeGen { ...@@ -2516,7 +2516,7 @@ impl CodeGenerator for ASMCodeGen {
fn emit_br_call( fn emit_br_call(
&mut self, &mut self,
callsite: Option<String>, callsite: Option<MuName>,
func: Reg, func: Reg,
pe: Option<MuName>, pe: Option<MuName>,
args: Vec<P<Value>>, args: Vec<P<Value>>,
...@@ -3444,7 +3444,7 @@ pub fn emit_code(fv: &mut MuFunctionVersion, vm: &VM) { ...@@ -3444,7 +3444,7 @@ pub fn emit_code(fv: &mut MuFunctionVersion, vm: &VM) {
{ {
let mut demangled_path = path::PathBuf::new(); let mut demangled_path = path::PathBuf::new();
demangled_path.push(&vm.vm_options.flag_aot_emit_dir); demangled_path.push(&vm.vm_options.flag_aot_emit_dir);
demangled_path.push(func.name() + ".demangled.S"); demangled_path.push((*func.name()).clone() + ".demangled.S");
let mut demangled_file = match File::create(demangled_path.as_path()) { let mut demangled_file = match File::create(demangled_path.as_path()) {
Err(why) => { Err(why) => {
...@@ -3468,7 +3468,7 @@ pub fn emit_code(fv: &mut MuFunctionVersion, vm: &VM) { ...@@ -3468,7 +3468,7 @@ pub fn emit_code(fv: &mut MuFunctionVersion, vm: &VM) {
}; };
let mut f = String::new(); let mut f = String::new();
mangled_file.read_to_string(&mut f).unwrap(); mangled_file.read_to_string(&mut f).unwrap();
let d = demangle_text(f); let d = demangle_text(&f);
match demangled_file.write_all(d.as_bytes()) { match demangled_file.write_all(d.as_bytes()) {
Err(why) => { Err(why) => {
panic!( panic!(
...@@ -3577,8 +3577,8 @@ use std::collections::HashMap; ...@@ -3577,8 +3577,8 @@ use std::collections::HashMap;
pub fn emit_context_with_reloc( pub fn emit_context_with_reloc(
vm: &VM, vm: &VM,
symbols: HashMap<Address, String>, symbols: HashMap<Address, MuName>,
fields: HashMap<Address, String> fields: HashMap<Address, MuName>
) { ) {
use std::path; use std::path;
use std::io::prelude::*; use std::io::prelude::*;
...@@ -3655,6 +3655,7 @@ pub fn emit_context_with_reloc( ...@@ -3655,6 +3655,7 @@ pub fn emit_context_with_reloc(
writeln!(file, "{}:", global_cell_name.clone()).unwrap(); writeln!(file, "{}:", global_cell_name.clone()).unwrap();
if is_valid_c_identifier(&demangled_name) { if is_valid_c_identifier(&demangled_name) {
let demangled_name = (*demangled_name).clone();
writeln!(file, "\t{}", directive_globl(demangled_name.clone())).unwrap(); writeln!(file, "\t{}", directive_globl(demangled_name.clone())).unwrap();
writeln!( writeln!(
file, file,
......
...@@ -120,7 +120,7 @@ pub trait CodeGenerator { ...@@ -120,7 +120,7 @@ pub trait CodeGenerator {
// Calls // Calls
fn emit_bl( fn emit_bl(
&mut self, &mut self,
callsite: Option<String>, callsite: Option<MuName>,
func: MuName, func: MuName,
pe: Option<MuName>, pe: Option<MuName>,
args: Vec<P<Value>>, args: Vec<P<Value>>,
...@@ -129,7 +129,7 @@ pub trait CodeGenerator { ...@@ -129,7 +129,7 @@ pub trait CodeGenerator {
) -> Option<ValueLocation>; ) -> Option<ValueLocation>;
fn emit_blr( fn emit_blr(
&mut self, &mut self,
callsite: Option<String>, callsite: Option<MuName>,
func: Reg, func: Reg,
pe: Option<MuName>, pe: Option<MuName>,
args: Vec<P<Value>>, args: Vec<P<Value>>,
...@@ -141,7 +141,7 @@ pub trait CodeGenerator { ...@@ -141,7 +141,7 @@ pub trait CodeGenerator {
fn emit_br(&mut self, dest_address: Reg); fn emit_br(&mut self, dest_address: Reg);
fn emit_b_call( fn emit_b_call(
&mut self,<