use llvmkit_asmparser::ll_parser::Parser;
use llvmkit_ir::Module;
fn parse_snippet(src: &str) -> (Module<'_>, String) {
let module = Module::new("test");
let _ = Parser::new(src.as_bytes(), &module)
.expect("parse constructor")
.parse_module()
.expect("parse succeeded");
let text = format!("{module}");
(module, text)
}
#[test]
fn undef_operand() {
let src = r#"
define i32 @f() {
%x = add i32 0, undef
ret i32 %x
}
"#;
let (_, text) = parse_snippet(src);
assert!(text.contains("add i32 0, undef"), "output: {text}");
}
#[test]
fn poison_operand() {
let src = r#"
define i32 @f() {
%x = add i32 poison, 1
ret i32 %x
}
"#;
let (_, text) = parse_snippet(src);
assert!(text.contains("add i32 poison, 1"), "output: {text}");
}
#[test]
fn float_decimal_literal() {
let src = r#"
define double @f(double %x) {
%y = fadd double %x, 1.0
ret double %y
}
"#;
let (_, text) = parse_snippet(src);
assert!(text.contains("fadd double %x,"), "output: {text}");
}
#[test]
fn float_hex_literal() {
let src = r#"
define double @f(double %x) {
%y = fadd double %x, 0x3FF0000000000000
ret double %y
}
"#;
let (_, text) = parse_snippet(src);
assert!(text.contains("fadd double %x,"), "output: {text}");
}
#[test]
fn zeroinitializer_float() {
let src = r#"
define double @f(double %x) {
%y = fadd double %x, zeroinitializer
ret double %y
}
"#;
let (_, _text) = parse_snippet(src);
}
#[test]
fn global_variable_reference() {
let src = r#"
@g = global i32 42
define i32 @f() {
%v = load i32, ptr @g
ret i32 %v
}
"#;
let (_, text) = parse_snippet(src);
assert!(text.contains("load i32, ptr @g"), "output: {text}");
}
#[test]
fn function_call_global_reference() {
let src = r#"
declare i32 @callee(i32)
define i32 @f(i32 %x) {
%v = call i32 @callee(i32 %x)
ret i32 %v
}
"#;
let (_, text) = parse_snippet(src);
assert!(text.contains("call i32 @callee(i32 %x)"), "output: {text}");
}