Commit bbfddb90 authored by Huacai Chen's avatar Huacai Chen

LoongArch: BPF: Avoid declare variables in switch-case

Not all compilers support declare variables in switch-case, so move
declarations to the beginning of a function. Otherwise we may get such
build errors:

arch/loongarch/net/bpf_jit.c: In function ‘emit_atomic’:
arch/loongarch/net/bpf_jit.c:362:3: error: a label can only be part of a statement and a declaration is not a statement
   u8 r0 = regmap[BPF_REG_0];
   ^~
arch/loongarch/net/bpf_jit.c: In function ‘build_insn’:
arch/loongarch/net/bpf_jit.c:727:3: error: a label can only be part of a statement and a declaration is not a statement
   u8 t7 = -1;
   ^~
arch/loongarch/net/bpf_jit.c:778:3: error: a label can only be part of a statement and a declaration is not a statement
   int ret;
   ^~~
arch/loongarch/net/bpf_jit.c:779:3: error: expected expression before ‘u64’
   u64 func_addr;
   ^~~
arch/loongarch/net/bpf_jit.c:780:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
   bool func_addr_fixed;
   ^~~~
arch/loongarch/net/bpf_jit.c:784:11: error: ‘func_addr’ undeclared (first use in this function); did you mean ‘in_addr’?
          &func_addr, &func_addr_fixed);
           ^~~~~~~~~
           in_addr
arch/loongarch/net/bpf_jit.c:784:11: note: each undeclared identifier is reported only once for each function it appears in
arch/loongarch/net/bpf_jit.c:814:3: error: a label can only be part of a statement and a declaration is not a statement
   u64 imm64 = (u64)(insn + 1)->imm << 32 | (u32)insn->imm;
   ^~~
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent 4805a13d
...@@ -279,6 +279,7 @@ static void emit_atomic(const struct bpf_insn *insn, struct jit_ctx *ctx) ...@@ -279,6 +279,7 @@ static void emit_atomic(const struct bpf_insn *insn, struct jit_ctx *ctx)
const u8 t1 = LOONGARCH_GPR_T1; const u8 t1 = LOONGARCH_GPR_T1;
const u8 t2 = LOONGARCH_GPR_T2; const u8 t2 = LOONGARCH_GPR_T2;
const u8 t3 = LOONGARCH_GPR_T3; const u8 t3 = LOONGARCH_GPR_T3;
const u8 r0 = regmap[BPF_REG_0];
const u8 src = regmap[insn->src_reg]; const u8 src = regmap[insn->src_reg];
const u8 dst = regmap[insn->dst_reg]; const u8 dst = regmap[insn->dst_reg];
const s16 off = insn->off; const s16 off = insn->off;
...@@ -359,8 +360,6 @@ static void emit_atomic(const struct bpf_insn *insn, struct jit_ctx *ctx) ...@@ -359,8 +360,6 @@ static void emit_atomic(const struct bpf_insn *insn, struct jit_ctx *ctx)
break; break;
/* r0 = atomic_cmpxchg(dst + off, r0, src); */ /* r0 = atomic_cmpxchg(dst + off, r0, src); */
case BPF_CMPXCHG: case BPF_CMPXCHG:
u8 r0 = regmap[BPF_REG_0];
move_reg(ctx, t2, r0); move_reg(ctx, t2, r0);
if (isdw) { if (isdw) {
emit_insn(ctx, lld, r0, t1, 0); emit_insn(ctx, lld, r0, t1, 0);
...@@ -390,8 +389,11 @@ static bool is_signed_bpf_cond(u8 cond) ...@@ -390,8 +389,11 @@ static bool is_signed_bpf_cond(u8 cond)
static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool extra_pass) static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool extra_pass)
{ {
const bool is32 = BPF_CLASS(insn->code) == BPF_ALU || u8 tm = -1;
BPF_CLASS(insn->code) == BPF_JMP32; u64 func_addr;
bool func_addr_fixed;
int i = insn - ctx->prog->insnsi;
int ret, jmp_offset;
const u8 code = insn->code; const u8 code = insn->code;
const u8 cond = BPF_OP(code); const u8 cond = BPF_OP(code);
const u8 t1 = LOONGARCH_GPR_T1; const u8 t1 = LOONGARCH_GPR_T1;
...@@ -400,8 +402,8 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext ...@@ -400,8 +402,8 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
const u8 dst = regmap[insn->dst_reg]; const u8 dst = regmap[insn->dst_reg];
const s16 off = insn->off; const s16 off = insn->off;
const s32 imm = insn->imm; const s32 imm = insn->imm;
int jmp_offset; const u64 imm64 = (u64)(insn + 1)->imm << 32 | (u32)insn->imm;
int i = insn - ctx->prog->insnsi; const bool is32 = BPF_CLASS(insn->code) == BPF_ALU || BPF_CLASS(insn->code) == BPF_JMP32;
switch (code) { switch (code) {
/* dst = src */ /* dst = src */
...@@ -724,24 +726,23 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext ...@@ -724,24 +726,23 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
case BPF_JMP32 | BPF_JSGE | BPF_K: case BPF_JMP32 | BPF_JSGE | BPF_K:
case BPF_JMP32 | BPF_JSLT | BPF_K: case BPF_JMP32 | BPF_JSLT | BPF_K:
case BPF_JMP32 | BPF_JSLE | BPF_K: case BPF_JMP32 | BPF_JSLE | BPF_K:
u8 t7 = -1;
jmp_offset = bpf2la_offset(i, off, ctx); jmp_offset = bpf2la_offset(i, off, ctx);
if (imm) { if (imm) {
move_imm(ctx, t1, imm, false); move_imm(ctx, t1, imm, false);
t7 = t1; tm = t1;
} else { } else {
/* If imm is 0, simply use zero register. */ /* If imm is 0, simply use zero register. */
t7 = LOONGARCH_GPR_ZERO; tm = LOONGARCH_GPR_ZERO;
} }
move_reg(ctx, t2, dst); move_reg(ctx, t2, dst);
if (is_signed_bpf_cond(BPF_OP(code))) { if (is_signed_bpf_cond(BPF_OP(code))) {
emit_sext_32(ctx, t7, is32); emit_sext_32(ctx, tm, is32);
emit_sext_32(ctx, t2, is32); emit_sext_32(ctx, t2, is32);
} else { } else {
emit_zext_32(ctx, t7, is32); emit_zext_32(ctx, tm, is32);
emit_zext_32(ctx, t2, is32); emit_zext_32(ctx, t2, is32);
} }
if (emit_cond_jmp(ctx, cond, t2, t7, jmp_offset) < 0) if (emit_cond_jmp(ctx, cond, t2, tm, jmp_offset) < 0)
goto toofar; goto toofar;
break; break;
...@@ -775,10 +776,6 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext ...@@ -775,10 +776,6 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
/* function call */ /* function call */
case BPF_JMP | BPF_CALL: case BPF_JMP | BPF_CALL:
int ret;
u64 func_addr;
bool func_addr_fixed;
mark_call(ctx); mark_call(ctx);
ret = bpf_jit_get_func_addr(ctx->prog, insn, extra_pass, ret = bpf_jit_get_func_addr(ctx->prog, insn, extra_pass,
&func_addr, &func_addr_fixed); &func_addr, &func_addr_fixed);
...@@ -811,8 +808,6 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext ...@@ -811,8 +808,6 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
/* dst = imm64 */ /* dst = imm64 */
case BPF_LD | BPF_IMM | BPF_DW: case BPF_LD | BPF_IMM | BPF_DW:
u64 imm64 = (u64)(insn + 1)->imm << 32 | (u32)insn->imm;
move_imm(ctx, dst, imm64, is32); move_imm(ctx, dst, imm64, is32);
return 1; return 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment