xo-jit: inspect struct alignment in utest
This commit is contained in:
parent
cf95f64961
commit
f971f18ecd
1 changed files with 32 additions and 0 deletions
|
|
@ -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()),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue