From f971f18ecde5cb81fa511164d9a8939e8c43b6d0 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 26 Jun 2024 13:10:00 -0400 Subject: [PATCH] xo-jit: inspect struct alignment in utest --- utest/MachPipeline.test.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/utest/MachPipeline.test.cpp b/utest/MachPipeline.test.cpp index 7a309f74..5e0fafc4 100644 --- a/utest/MachPipeline.test.cpp +++ b/utest/MachPipeline.test.cpp @@ -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(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(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()),