| // SPDX-License-Identifier: GPL-2.0 | |
| /* | |
| * Non-trivial C macros cannot be used in Rust. Similarly, inlined C functions | |
| * cannot be called either. This file explicitly creates functions ("helpers") | |
| * that wrap those so that they can be called from Rust. | |
| * | |
| * Sorted alphabetically. | |
| */ | |
| #include <linux/compiler_types.h> | |
| #ifdef __BINDGEN__ | |
| // Omit `inline` for bindgen as it ignores inline functions. | |
| #define __rust_helper | |
| #else | |
| // The helper functions are all inline functions. | |
| // | |
| // We use `__always_inline` here to bypass LLVM inlining checks, in case the | |
| // helpers are inlined directly into Rust CGUs. | |
| // | |
| // The LLVM inlining checks are false positives: | |
| // * LLVM doesn't want to inline functions compiled with | |
| // `-fno-delete-null-pointer-checks` with code compiled without. | |
| // The C CGUs all have this enabled and Rust CGUs don't. Inlining is okay | |
| // since this is one of the hardening features that does not change the ABI, | |
| // and we shouldn't have null pointer dereferences in these helpers. | |
| // * LLVM doesn't want to inline functions with different list of builtins. C | |
| // side has `-fno-builtin-wcslen`; `wcslen` is not a Rust builtin, so they | |
| // should be compatible, but LLVM does not perform inlining due to attributes | |
| // mismatch. | |
| // * clang and Rust doesn't have the exact target string. Clang generates | |
| // `+cmov,+cx8,+fxsr` but Rust doesn't enable them (in fact, Rust will | |
| // complain if `-Ctarget-feature=+cmov,+cx8,+fxsr` is used). x86-64 always | |
| // enable these features, so they are in fact the same target string, but | |
| // LLVM doesn't understand this and so inlining is inhibited. This can be | |
| // bypassed with `--ignore-tti-inline-compatible`, but this is a hidden | |
| // option. | |
| #define __rust_helper __always_inline | |
| #endif | |
| #include "atomic.c" | |
| #include "atomic_ext.c" | |
| #include "auxiliary.c" | |
| #include "barrier.c" | |
| #include "binder.c" | |
| #include "bitmap.c" | |
| #include "bitops.c" | |
| #include "blk.c" | |
| #include "bug.c" | |
| #include "build_assert.c" | |
| #include "build_bug.c" | |
| #include "clk.c" | |
| #include "completion.c" | |
| #include "cpu.c" | |
| #include "cpufreq.c" | |
| #include "cpumask.c" | |
| #include "cred.c" | |
| #include "device.c" | |
| #include "dma.c" | |
| #ifdef CONFIG_DMA_SHARED_BUFFER | |
| #include "dma-resv.c" | |
| #endif | |
| #include "drm.c" | |
| #include "drm_gpuvm.c" | |
| #include "err.c" | |
| #include "fs.c" | |
| #include "fwctl.c" | |
| #include "gpu.c" | |
| #include "interrupt.c" | |
| #include "io.c" | |
| #include "irq.c" | |
| #include "jump_label.c" | |
| #include "kunit.c" | |
| #include "list.c" | |
| #include "maple_tree.c" | |
| #include "mm.c" | |
| #include "mutex.c" | |
| #include "net/genetlink.c" | |
| #include "of.c" | |
| #include "page.c" | |
| #include "pci.c" | |
| #include "pid_namespace.c" | |
| #include "platform.c" | |
| #include "poll.c" | |
| #include "processor.c" | |
| #include "property.c" | |
| #include "pwm.c" | |
| #include "rbtree.c" | |
| #include "rcu.c" | |
| #include "refcount.c" | |
| #include "regulator.c" | |
| #include "scatterlist.c" | |
| #include "security.c" | |
| #include "serdev.c" | |
| #include "signal.c" | |
| #include "slab.c" | |
| #include "spinlock.c" | |
| #include "string.c" | |
| #include "srcu.c" | |
| #include "sync.c" | |
| #include "task.c" | |
| #include "time.c" | |
| #include "uaccess.c" | |
| #include "usb.c" | |
| #include "vmalloc.c" | |
| #include "wait.c" | |
| #include "workqueue.c" | |
| #include "xarray.c" |