xo-jit: inspect struct alignment in utest

This commit is contained in:
Roland Conybeare 2024-06-26 13:10:00 -04:00
commit f971f18ecd

View file

@ -231,8 +231,12 @@ namespace xo {
REQUIRE(struct_td);
// ----- build AST -----
auto fn_ast = make_ratio();
// ----- convert AST -> llvm IR datastructure -----
llvm::Value * llvm_ircode = jit->codegen_toplevel(fn_ast);
/* TODO: printer for llvm::Value* */
@ -249,12 +253,38 @@ namespace xo {
REQUIRE(llvm_ircode);
// ----- inspect alignment -----
llvm::StructType * struct_llvm_type
= static_cast<llvm::StructType *>(jit->codegen_type(struct_td));
auto struct_layout = jit->data_layout().getStructLayout(struct_llvm_type);
log && log(xtag("struct-size", struct_layout->getSizeInBytes()),
xtag("struct-alignment", struct_layout->getAlignment().value()));
for (int i = 0, n = struct_llvm_type->getNumElements(); i < n; ++i) {
llvm::TypeSize llvm_tz = struct_layout->getElementOffset(i);
auto offset = reinterpret_cast<uint64_t>(struct_td->struct_member(i).get_member_tp(nullptr).address());
log && log(xtag("i", i),
xtag("name(c++)", struct_td->struct_member(i).member_name()),
xtag("type(c++)", struct_td->struct_member(i).get_member_td()->short_name()),
xtag("offset(c++)", offset),
xtag("offset(llvm)", llvm_tz.getKnownMinValue()));
REQUIRE(offset == llvm_tz.getKnownMinValue());
}
// ----- generate JIT machine code -----
jit->machgen_current_module();
log && log("execution session after codegen:");
//log && log(jit->xsession()); // segfaults
jit->dump_execution_session();
// ----- verify: lookup symbol
/** lookup compiled function pointer in jit **/
auto llvm_addr = jit->lookup_symbol(fn_ast->name());
@ -276,6 +306,8 @@ namespace xo {
REQUIRE(fn_ptr);
// ---- invoke compiled function -----
auto value = (*fn_ptr)(2, 3);
log && log(xtag("value.num", value.num()),