#![cfg(feature="llvm-9-or-greater")]
use llvm_ir::Module;
use std::path::Path;
macro_rules! llvm_test {
($path:expr, $func:ident) => {
#[test]
#[allow(non_snake_case)]
fn $func() {
let _ = env_logger::builder().is_test(true).try_init(); let path = Path::new($path);
let _ = Module::from_bc_path(&path).expect("Failed to parse module");
}
};
}
llvm_test!("tests/llvm_bc/DISubprogram-v5.ll.bc", DISubprogram_v5);
llvm_test!("tests/llvm_bc/callbr.ll.bc", callbr);
llvm_test!("tests/llvm_bc/objectsize-upgrade-7.0.ll.bc", objectsize_upgrade_7_0);
llvm_test!("tests/llvm_bc/upgrade-global-dtors.ll.bc", upgrade_global_dtors);
llvm_test!("tests/llvm_bc/upgrade-vecreduce-intrinsics.ll.bc", upgrade_vecreduce_intrinsics);
use llvm_ir::{terminator, Name};
use std::convert::TryInto;
#[test]
fn callbr_parsing() {
let _ = env_logger::builder().is_test(true).try_init(); let path = Path::new("tests/llvm_bc/callbr.ll.bc");
let module = Module::from_bc_path(&path).expect("Failed to parse module");
let func = module
.get_func_by_name("test_asm_goto")
.expect("Failed to find function");
let bb = func.get_bb_by_name(&Name::from("entry")).expect("Failed to find entry bb");
let callbr: &terminator::CallBr = &bb.term.clone().try_into().unwrap_or_else(|_| panic!("Expected a callbr, got {:?}", &bb.term));
assert!(callbr.function.is_left());
assert_eq!(callbr.return_label, Name::from("normal"));
assert_eq!(
&format!("{}", callbr),
"%0 = callbr <inline assembly>(i32 %x, blockaddr) to label %normal",
)
}