use llvmkit_asmparser::ll_parser::Parser;
use llvmkit_ir::Module;
fn parse_snippet(src: &str) -> String {
Module::with_new("test", |module| {
let _ = Parser::new(src.as_bytes(), &module)
.expect("parse constructor")
.parse_module()
.expect("parse succeeded");
format!("{module}")
})
}
#[test]
fn landingpad_round_trips() {
let text = parse_snippet(
r#"define void @f() {
entry:
br label %lpad
lpad:
%e = landingpad { ptr, i32 } catch ptr null
resume { ptr, i32 } %e
}
"#,
);
assert!(
text.contains("%e = landingpad { ptr, i32 }\n catch ptr null\n"),
"got: {text}"
);
}
#[test]
fn resume_round_trips() {
let text = parse_snippet(
r#"define void @f() {
entry:
br label %lpad
lpad:
%e = landingpad { ptr, i32 } cleanup
resume { ptr, i32 } %e
}
"#,
);
assert!(text.contains("resume { ptr, i32 } %e\n"), "got: {text}");
}
#[test]
fn invoke_round_trips() {
let text = parse_snippet(
r#"declare void @may_throw()
define void @f() {
entry:
invoke void @may_throw() to label %normal unwind label %lpad
normal:
ret void
lpad:
%e = landingpad { ptr, i32 } catch ptr null
resume { ptr, i32 } %e
}
"#,
);
assert!(
text.contains("invoke void @may_throw()\n to label %normal unwind label %lpad\n"),
"got: {text}"
);
}
#[test]
fn cleanuppad_cleanupret_round_trips() {
let text = parse_snippet(
r#"define void @f() {
entry:
br label %pad_bb
pad_bb:
%cp = cleanuppad within none []
cleanupret from token %cp unwind to caller
}
"#,
);
assert!(
text.contains("%cp = cleanuppad within none []\n"),
"got: {text}"
);
assert!(
text.contains("cleanupret from %cp unwind to caller\n"),
"got: {text}"
);
}