BPF: provide better error message for unsupported atomic operations

Authored by yonghong-song on Mar 11 2021, 12:28 PM.


BPF: provide better error message for unsupported atomic operations

Currently, BPF backend does not support all variants of

atomic_load_{add,and,or,xor}, atomic_swap and atomic_cmp_swap

For example, it only supports 32bit (with alu32 mode) and 64bit
operations for atomic_load_{and,or,xor}, atomic_swap and
atomic_cmp_swap. Due to historical reason, atomic_load_add is
always supported with 32bit and 64bit.

If user used an unsupported atomic operation, currently,
codegen selectiondag cannot find bpf support and will issue
a fatal error. This is not user friendly as user may mistakenly
think this is a compiler bug.

This patch added Custom rule for unsupported atomic operations
and will emit better error message during ReplaceNodeResults()
callback. The following is an example output.

$ cat t.c
short sync(short *p) {
  return  __sync_val_compare_and_swap (p, 2, 3);
$ clang -target bpf -O2 -g -c t.c
t.c:2:11: error: Unsupported atomic operations, please use 64 bit version
  return  __sync_val_compare_and_swap (p, 2, 3);
fatal error: error in backend: Cannot select: t19: i64,ch =
  AtomicCmpSwap<(load store seq_cst seq_cst 2 on %ir.p)> t0, t2,
  Constant:i64<2>, Constant:i64<3>, t.c:2:11
  t2: i64,ch = CopyFromReg t0, Register:i64 %0
    t1: i64 = Register %0
  t11: i64 = Constant<2>
  t10: i64 = Constant<3>
In function: sync
PLEASE submit a bug report ...

Fatal error will still happen since we did not really do proper
lowering for these unsupported atomic operations. But we do get
a much better error message.

Differential Revision: https://reviews.llvm.org/D98471