Lines Matching defs:subprog

4598 	/* loading subprog addresses */
4604 pr_warn("prog '%s': bad subprog addr relo against '%s' at offset %zu+%d\n",
6026 /* When __weak subprog is "overridden" by another instance
6027 * of the subprog from a different object file, linker still
6032 * subprog instructions when discovering subprograms.
6406 static int append_subprog_relos(struct bpf_program *main_prog, struct bpf_program *subprog)
6408 int new_cnt = main_prog->nr_reloc + subprog->nr_reloc;
6412 if (main_prog == subprog)
6421 if (subprog->nr_reloc)
6422 memcpy(relos + main_prog->nr_reloc, subprog->reloc_desc,
6423 sizeof(*relos) * subprog->nr_reloc);
6426 relos[i].insn_idx += subprog->sub_insn_off;
6437 struct bpf_program *subprog)
6443 subprog->sub_insn_off = main_prog->insns_cnt;
6445 new_cnt = main_prog->insns_cnt + subprog->insns_cnt;
6454 memcpy(main_prog->insns + subprog->sub_insn_off, subprog->insns,
6455 subprog->insns_cnt * sizeof(*insns));
6458 main_prog->name, subprog->insns_cnt, subprog->name);
6460 /* The subprog insns are now appended. Append its relos too. */
6461 err = append_subprog_relos(main_prog, subprog);
6472 struct bpf_program *subprog;
6505 * for subprog addr relocation, the relo->sym_off + insn->imm is
6517 pr_warn("prog '%s': missing subprog addr relo for insn #%zu\n",
6531 subprog = find_prog_by_sec_insn(obj, obj->efile.text_shndx, sub_insn_idx);
6532 if (!subprog) {
6539 * subprogram (meaning this subprog hasn't been processed
6548 if (subprog->sub_insn_off == 0) {
6549 err = bpf_object__append_subprog_code(obj, main_prog, subprog);
6552 err = bpf_object__reloc_code(obj, main_prog, subprog);
6564 * well), so position of any subprog can be different for
6567 insn->imm = subprog->sub_insn_off - (prog->sub_insn_off + insn_idx) - 1;
6569 pr_debug("prog '%s': insn #%zu relocated, imm %d points to subprog '%s' (now at %zu offset)\n",
6570 prog->name, insn_idx, insn->imm, subprog->name, subprog->sub_insn_off);
6580 * main prog) is processed separately. For each subprog (non-entry functions,
6585 * where given subprog was appended. This will further be used to relocate all
6586 * the call instructions jumping into this subprog.
6589 * is into a subprog that hasn't been processed (i.e., subprog->sub_insn_off
6590 * is zero), subprog instructions are appended at the end of main program's
6594 * the *main* prog's instructions (subprog's instructions are always left
6596 * and subprog instructions are always sent only as part of a main prog) and
6601 * desired target subprog.
6605 * subprog->sub_insn_off as zero at all times and won't be appended to current
6660 struct bpf_program *subprog;
6667 subprog = &obj->programs[i];
6668 if (!prog_is_subprog(obj, subprog))
6671 subprog->sub_insn_off = 0;
6756 * case, hence simply skip appending a subprog.
6771 struct bpf_program *subprog = &obj->programs[j];
6773 if (!prog_is_subprog(obj, subprog))
6775 if (strcmp(name, subprog->name) != 0)
6781 if (!subprog->sym_global || subprog->mark_btf_static) {
6783 prog->name, subprog->name);
6789 prog->name, subprog->name);
6912 pr_warn("prog '%s': subprog '%s' arg#%d is expected to be of `struct %s *` type\n",
6979 /* Check if main program or global subprog's function prototype has `arg:ctx`
7028 * of our subprogs; if yes and subprog is global and needs adjustment,
7058 /* current main program doesn't call into this subprog */
7164 * Append subprog relos to main programs to allow data relos to be
7189 struct bpf_program *subprog = &obj->programs[prog->exception_cb_idx];
7196 if (subprog->sub_insn_off == 0) {
7197 err = bpf_object__append_subprog_code(obj, prog, subprog);
7200 err = bpf_object__reloc_code(obj, prog, subprog);