ziglang / zig

General-purpose programming language and toolchain for maintaining robust, optimal, and reusable software.
https://ziglang.org
MIT License
35.25k stars 2.57k forks source link

liburing: unable to translate function #5101

Open jpittis opened 4 years ago

jpittis commented 4 years ago

Ran into some "unable to translate function" errors when trying to use liburing:

./zig-cache/o/yQ6K25ocH8MNArGcIQfQgEaYDzM-vpeJWZlivEDNea4714ETWd35K3XZmZyX1Uuy/cimport.zig:1558:33: error: unable to translate function
pub const __io_uring_peek_cqe = @compileError("unable to translate function");
                                ^
./zig-cache/o/yQ6K25ocH8MNArGcIQfQgEaYDzM-vpeJWZlivEDNea4714ETWd35K3XZmZyX1Uuy/cimport.zig:1564:11: note: referenced here
    err = __io_uring_peek_cqe(ring, cqe_ptr);
          ^
./zig-cache/o/yQ6K25ocH8MNArGcIQfQgEaYDzM-vpeJWZlivEDNea4714ETWd35K3XZmZyX1Uuy/cimport.zig:1275:33: error: unable to translate function
pub const io_uring_cq_advance = @compileError("unable to translate function");
                                ^
./zig-cache/o/yQ6K25ocH8MNArGcIQfQgEaYDzM-vpeJWZlivEDNea4714ETWd35K3XZmZyX1Uuy/cimport.zig:1279:22: note: referenced here
    if (cqe != null) io_uring_cq_advance(ring, @bitCast(c_uint, @as(c_int, 1)));

To reproduce, you can add these to your build file:

lib.linkSystemLibrary("c");
lib.linkSystemLibrary("liburing");

Import liburing:

const liburing = @cImport({
  @cInclude("liburing.h");
});

And try to call liburing.io_uring_wait_cqe and or liburing.io_uring_cqe_seen.

A minimal example would likely be something along the lines of:

var ring: liburing.io_uring = undefined;
_ = liburing.io_uring_queue_init(1, &ring, 0);
var cqe: liburing.io_uring_cqe = undefined;
var ptr: ?*liburing.struct_io_uring_cqe = &cqe;
_ = liburing.io_uring_wait_cqe(&ring, &ptr);
liburing.io_uring_cqe_seen(&ring, &cqe);

Hope this is helpful.

daurnimator commented 4 years ago

Note that I've been working on some uring things for the zig std lib. https://github.com/ziglang/zig/pull/3083 is the only published artifact at the moment. At some point in the current release cycle I will revisit it.

lorislibralato commented 11 months ago

Currently const c = @cImport(@cInclude("liburing.h")); works but with warning on atomics, function like io_uring_buf_ring_advance are demoted to pub extern fn but in the c code they are static inline

error when calling io_uring_buf_ring_advance in zig: _error: ld.lld: undefined symbol: io_uring_buf_ringadvance

mayerraphael commented 8 months ago

__io_uring_peek_cqe also causes an // /usr/include/liburing.h:1245:19: warning: unable to translate function, demoted to extern.

It uses io_uring_smp_load_acquire, which uses __typeof__, which fails.

pub const io_uring_smp_load_acquire = @compileError("unable to translate macro: undefined identifier `__typeof__`"); // /usr/include/liburing/barrier.h:73:9
#define io_uring_smp_load_acquire(p)                \
    atomic_load_explicit((_Atomic __typeof__(*(p)) *)(p),   \
                 memory_order_acquire)`

__typeof__ is a compiler extension.

Edit: typeof is now a c23 standard: https://learn.microsoft.com/de-de/cpp/c-language/typeof-c?view=msvc-170