Issue 165696
Summary [BPF] __bpf_trap declaration emitted even if not called
Labels backend:BPF
Assignees
Reporter nikic
    For this IR:
```llvm
target triple = "bpf"
    
define i32 @test(i8 %x) { 
entry:
  %0 = and i8 %x, 3
  switch i8 %0, label %default.unreachable4 [
    i8 0, label %return
    i8 1, label %sw.bb1
    i8 2, label %sw.bb2
    i8 3, label %sw.bb3
  ]

sw.bb1: ; preds = %entry
  br label %return

sw.bb2: ; preds = %entry
  br label %return

sw.bb3: ; preds = %entry
  br label %return

default.unreachable4:                             ; preds = %entry
  unreachable

return:                                           ; preds = %entry, %sw.bb3, %sw.bb2, %sw.bb1
  %retval.0 = phi i32 [ 12, %sw.bb1 ], [ 43, %sw.bb2 ], [ 54, %sw.bb3 ], [ 32, %entry ]
  ret i32 %retval.0
}
```
llc produces:
```
	.file	"<stdin>"
	.text
	.globl	test # -- Begin function test
	.p2align	3
	.type	test,@function
test: # @test
	.cfi_startproc
# %bb.0:                                # %entry
	w1 &= 3
	if w1 s> 1 goto LBB0_3
# %bb.1: # %entry
	w0 = 32
	if w1 == 0 goto LBB0_6
# %bb.2: # %entry
	w0 = 12
	goto LBB0_6
LBB0_3: # %entry
	if w1 == 2 goto LBB0_5
# %bb.4: # %entry
	w0 = 54
	goto LBB0_6
LBB0_5: # %sw.bb2
	w0 = 43
LBB0_6:                                 # %return
	exit
.Lfunc_end0:
	.size	test, .Lfunc_end0-test
	.cfi_endproc
                                        # -- End function
	.weak	__bpf_trap
```
Note that it declares `.weak __bpf_trap`, even though the function is never called. This results in a `libbpf: extern weak function __bpf_trap is unsupported` error on kernels that don't have support for `__bpf_trap`. On kernels that do have it, there is no error because there is no call.

The reason is that the `default.unreachable4` gets lowered to a call to `__bpf_trap` originally and then gets eliminated as an unused block.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to