use llvmkit_asmparser::ll_parser::Parser;
use llvmkit_asmparser::parse_error::ParseError;
use llvmkit_ir::Module;
fn parse_and_print(src: &str) -> String {
Module::with_new("parser_use_list", |module| {
Parser::new(src.as_bytes(), &module)
.expect("lexer primes")
.parse_module()
.expect("parser succeeds");
format!("{module}")
})
}
fn parse_err(src: &str) -> ParseError {
Module::with_new("parser_use_list", |module| {
Parser::new(src.as_bytes(), &module)
.expect("lexer primes")
.parse_module()
.expect_err("parser rejects malformed use-list directive")
})
}
#[test]
fn module_uselistorder_round_trips_global_callee() {
let src = r#"
declare void @callee()
define void @user() {
entry:
call void @callee()
call void @callee()
ret void
}
uselistorder ptr @callee, { 1, 0 }
"#;
let printed = parse_and_print(src);
assert!(printed.contains("uselistorder ptr @callee, { 1, 0 }\n"));
let reparsed = parse_and_print(&printed);
assert!(reparsed.contains("uselistorder ptr @callee, { 1, 0 }\n"));
}
#[test]
fn function_uselistorder_round_trips_local_value() {
let src = r#"
define i32 @f(i32 %a) {
entry:
%x = add i32 %a, 1
%y = add i32 %x, 2
%z = add i32 %x, 3
ret i32 %z
uselistorder i32 %x, { 1, 0 }
}
"#;
let printed = parse_and_print(src);
assert!(printed.contains(" uselistorder i32 %x, { 1, 0 }\n}"));
let reparsed = parse_and_print(&printed);
assert!(reparsed.contains(" uselistorder i32 %x, { 1, 0 }\n}"));
}
#[test]
fn ordered_uselistorder_indexes_are_rejected() {
let src = r#"
declare void @callee()
define void @user() {
entry:
call void @callee()
call void @callee()
ret void
}
uselistorder ptr @callee, { 0, 1 }
"#;
match parse_err(src) {
ParseError::Expected { expected, .. } => {
assert_eq!(
expected,
"expected uselistorder indexes to change the order"
);
}
other => panic!("unexpected error: {other:?}"),
}
}