【发布时间】:2021-12-30 09:32:10
【问题描述】:
我编写了一个 BPF 对象文件,其中包含一个部分和一个静态内联函数,其定义如下:
static inline __attribute__((always_inline)) bpf_call_func(...);
__section("entry") bpf_func(...); // called bpf_call_func
效果很好,当我使用 llvm-objdump 时,它显示 bpf_call_func 已经被内联了。
但是当我在同一个目标文件中定义了另一个动作时,也称为bpf_call_func
static inline __attribute__((always_inline)) bpf_call_func(...);
__section("entry") bpf_func(...); // called bpf_call_func
__section("entry2") bpf_func2(...); // called bpf_call_func
llvm-objdump 显示 bpf_call_func 没有内联到 bpf_func 和 bpf_func2。它只是在.text 部分中定义的,而bpf_func 和bpf_func2 使用call 指令调用bpf_call_func。
bpf_call_func 大约有 600 条指令。 bpf_func 和 bpf_func 大约有 250 条指令。
我查看了 gcc 手册,上面写着:
请注意,函数定义中的某些用法可能使其不适合内联替换。这些用法包括:可变参数函数、alloca 的使用、计算的 goto 的使用(参见作为值的标签)、非本地 goto 的使用、嵌套函数的使用、setjmp 的使用、__builtin_longjmp 的使用以及 __builtin_return 或 __builtin_apply_args 的使用。当标记为 inline 的函数无法替换时,使用 -Winline 会发出警告,并给出失败的原因。
但我不知道哪些情况符合我的情况。
我想知道为什么bpf_call_func inline 有两个部分时不调用它?
和bpf_call_func的指令号有关系吗?
【问题讨论】:
-
您能否分享一个
always_inline不起作用的最小可重现示例(使用函数的主体和原型)?
标签: compiler-construction clang inline ebpf