Stream: general

Topic: cranelift


view this post on Zulip lechat (Sep 03 2022 at 20:23):

Hello. I am new to Cranelift-jit. I hope this is the right place to ask.
I want to do something like this and call this from cranelift:
pub extern "C" fn to_jitval(ptr: *mut Parameter) -> (i64, i64) {
let r = unsafe {Box::from_raw(ptr)};
(r.value, r.value_type)
}
This works, I successfully receive multiple return values when it is called from cranlift jit.
But I think this return type (tuple) is unstable usage of ABI. Is it unsafe to do this? How can I return multiple values from a function?

view this post on Zulip bjorn3 (Sep 04 2022 at 12:25):

multi-return doesn't work for the C abi. You will have to instead pass for example a pointer where the callee can write the return value to.

view this post on Zulip clearloop (Sep 09 2025 at 09:41):

Hi there, I'm recently building a frontend of cranelift for a RISCV like instruction set! everything works perfectly except the JumpTable part ... I'm confused about the flow of the SSA via jump table, I need to pass some Variables to the target branches (I have 14 variables act like my virtual registers), however I found the Jump table is easy broken if my target branches are far away from the definition of the jump table with error like

    Caused by:
        0: Verifier errors
        1: - inst75 (br_table v87, block23, [block3(v56, v121, v193, v269, v346, v423, v54, v169, v241, v317, v394, v471, v103, v170, v242, v318, v395, v472, v104, v123, v195, v319, v396, v473, v105, v120, v243, v268, v345, v422, v106, v171, v244, v320, v397, v474, v107, v115, v188, v321, v398, v475, v108, v172, v245, v322, v399, v476, v109, v173, v246, v323, v400, v477, v110, v174, v247, v324, v401, v478, v111, v175, v248, v325, v402, v479, v112, v176, v249, v271, v348, v425, v113, v177, v250, v326, v403, v480, v114, v178, v251, v327, v404, v481), block4(v56, v121, v193, v269, v346, v423, v104, v123, v195, v319, v396, v473, v54, v169, v241, v317, v394, v471, v103, v170, v242, v318, v395, v472, v106, v171, v244, v320, v397, v474, v108, v172, v245, v322, v399, v476, v109, v173, v246, v323, v400, v477, v110, v174, v247, v324, v401, v478, v111, v175, v248, v325, v402, v479, v112, v176, v249, v271, v348, v425, v113, v177, v250, v326, v403, v480, v114, v178, v251, v327, v404, v481, v107, v115, v188, v321, v398, v475), block6(v56, v121, v193, v269, v346, v423, v54, v169, v241, v317, v394, v471, v103, v170, v242, v318, v395, v472, v104, v123, v195, v319, v396, v473, v105, v120, v243, v268, v345, v422, v106, v171, v244, v320, v397, v474, v107, v115, v188, v321, v398, v475, v108, v172, v245, v322, v399, v476, v109, v173, v246, v323, v400, v477, v110, v174, v247, v324, v401, v478, v111, v175, v248, v325, v402, v479, v112, v176, v249, v271, v348, v425, v113, v177, v250, v326, v403, v480, v114, v178, v251, v327, v404, v481), block7(v56, v121, v193, v269, v346, v423, v104, v123, v195, v319, v396, v473, v54, v169, v241, v317, v394, v471, v103, v170, v242, v318, v395, v472, v106, v171, v244, v320, v397, v474, v108, v172, v245, v322, v399, v476, v109, v173, v246, v323, v400, v477, v110, v174, v247, v324, v401, v478, v111, v175, v248, v325, v402, v479, v114, v178, v251, v327, v404, v481, v107, v115, v188, v321, v398, v475, v112, v176, v249, v271, v348, v425, v113, v177, v250, v326, v403, v480), block10(v56, v121, v193, v269, v346, v423, v107, v115, v188, v321, v398, v475, v113, v177, v250, v326, v403, v480, v54, v169, v241, v317, v394, v471, v103, v170, v242, v318, v395, v472, v106, v171, v244, v320, v397, v474, v108, v172, v245, v322, v399, v476, v109, v173, v246, v323, v400, v477, v110, v174, v247, v324, v401, v478, v111, v175, v248, v325, v402, v479, v114, v178, v251, v327, v404, v481, v104, v123, v195, v319, v396, v473, v105, v120, v243, v268, v345, v422, v112, v176, v249, v271, v348, v425), block11(v113, v177, v250, v326, v403, v480, v56, v121, v193, v269, v346, v423, v54, v169, v241, v317, v394, v471, v103, v170, v242, v318, v395, v472, v106, v171, v244, v320, v397, v474, v107, v115, v188, v321, v398, v475, v108, v172, v245, v322, v399, v476, v109, v173, v246, v323, v400, v477, v110, v174, v247, v324, v401, v478, v111, v175, v248, v325, v402, v479, v114, v178, v251, v327, v404, v481), block14(v56, v121, v193, v269, v346, v423, v107, v115, v188, v321, v398, v475, v113, v177, v250, v326, v403, v480, v54, v169, v241, v317, v394, v471, v103, v170, v242, v318, v395, v472, v106, v171, v244, v320, v397, v474, v108, v172, v245, v322, v399, v476, v109, v173, v246, v323, v400, v477, v110, v174, v247, v324, v401, v478, v111, v175, v248, v325, v402, v479, v114, v178, v251, v327, v404, v481, v104, v123, v195, v319, v396, v473, v105, v120, v243, v268, v345, v422, v112, v176, v249, v271, v348, v425), block15(v113, v177, v250, v326, v403, v480, v56, v121, v193, v269, v346, v423, v54, v169, v241, v317, v394, v471, v103, v170, v242, v318, v395, v472, v106, v171, v244, v320, v397, v474, v107, v115, v188, v321, v398, v475, v108, v172, v245, v322, v399, v476, v109, v173, v246, v323, v400, v477, v110, v174, v247, v324, v401, v478, v111, v175, v248, v325, v402, v479, v114, v178, v251, v327, v404, v481), block18(v56, v121, v193, v269, v346, v423, v107, v115, v188, v321, v398, v475, v113, v177, v250, v326, v403, v480, v54, v169, v241, v317, v394, v471, v103, v170, v242, v318, v395, v472, v106, v171, v244, v320, v397, v474, v108, v172, v245, v322, v399, v476, v109, v173, v246, v323, v400, v477, v110, v174, v247, v324, v401, v478, v111, v175, v248, v325, v402, v479, v114, v178, v251, v327, v404, v481, v104, v123, v195, v319, v396, v473, v105, v120, v243, v268, v345, v422, v112, v176, v249, v271, v348, v425), block19(v113, v177, v250, v326, v403, v480, v56, v121, v193, v269, v346, v423, v54, v169, v241, v317, v394, v471, v103, v170, v242, v318, v395, v472, v106, v171, v244, v320, v397, v474, v107, v115, v188, v321, v398, v475, v108, v172, v245, v322, v399, v476, v109, v173, v246, v323, v400, v477, v110, v174, v247, v324, v401, v478, v111, v175, v248, v325, v402, v479, v114, v178, v251, v327, v404, v481, v105, v120, v243, v268, v345, v422, v112, v176, v249, v271, v348, v425)]  ; v123 = 2, v195 = 6, v115 = 2, v188 = 3, v271 = 10, v348 = 14, v425 = 18, v123 = 2, v195 = 6, v271 = 10, v348 = 14, v425 = 18, v115 = 2, v188 = 3, v123 = 2, v195 = 6, v115 = 2, v188 = 3, v271 = 10, v348 = 14, v425 = 18, v123 = 2, v195 = 6, v115 = 2, v188 = 3, v271 = 10, v348 = 14, v425 = 18, v115 = 2, v188 = 3, v123 = 2, v195 = 6, v271 = 10, v348 = 14, v425 = 18, v115 = 2, v188 = 3, v115 = 2, v188 = 3, v123 = 2, v195 = 6, v271 = 10, v348 = 14, v425 = 18, v115 = 2, v188 = 3, v115 = 2, v188 = 3, v123 = 2, v195 = 6, v271 = 10, v348 = 14, v425 = 18, v115 = 2, v188 = 3, v271 = 10, v348 = 14, v425 = 18): uses value v121 from non-dominating inst97
  1. I know that we can not pass block arguments via br_table directly, so we have block args and value list as arguments on the creation of BlockCall for the JumpTable
  2. the limitation of passing my "Variables (Values)" with block args is that they may changed in the future blocks, so this does not fit my case
  3. creating BlockCall with passing builder.func.dfg.value_list works for Variables if I only have few blocks in my program, but it doesn't work if I have a lot of blocks, will emit error like I provided above

So, I'm now thinking about what's the true usage of value_list? if I can host a Value list only specify my virtual registers only, I can update my host value list as well when I update my virtual registers

  1. I tried to maintain a ValueList but I found the BlockCall constructor doesn't accept it...and seems there is no way to convert ValueList to PoolList...
  2. if I found the solution passing my host ValueList to BlockCalls, what does it mean for Variables? if I can set/get from my value list for the cross blocks usages, I don't need Variables anymore

Last updated: Dec 06 2025 at 06:05 UTC