[PATCH] D107882: BPF: Enable frontend constant folding for VLA size

Yonghong Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 10 23:33:29 PDT 2021


yonghong-song created this revision.
yonghong-song added a reviewer: rsmith.
Herald added a subscriber: dexonsmith.
yonghong-song requested review of this revision.
Herald added projects: clang, LLVM.
Herald added subscribers: llvm-commits, cfe-commits.

Paul Chaignon reported a bpf verifier failure ([1]) due to using
non-ABI register R11 <https://reviews.llvm.org/source/libunwind/>. For the test case, llvm11 is okay while
llvm12 and later generates verifier unfriendly code.

The failure is related to variable length array size.
The following mimics the variable length array definition
in the test case:

  #define AA 40
  struct t { char a[20]; };
  void foo(void *); 
  int test() {
     const int a = 8;
     char tmp[AA + sizeof(struct t) + a]; 
     foo(tmp);
     ... 
  }

Paul helped bisect that the following llvm commit is
responsible:

  552c6c232872 ("PR44406: Follow behavior of array bound constant
                folding in more recent versions of GCC.")

Basically, before the above commit, clang frontend did constant
folding for array size "AA + sizeof(struct t) + a" to be 68, 
so used alloca for stack allocation. After the above commit,
clang frontend didn't do constant folding for array size
any more, which results in a VLA and "llvm.stacksave"/"llvm.stackrestore"
is generated.

BPF architecture API does not support stack pointer (sp) register.
The LLVM internally used R11 <https://reviews.llvm.org/source/libunwind/> to indicate sp register but it should
not be in the final code. Otherwise, kernel verifier will reject it.

This patch attempts to permit array size constant folding
in clang frontend for BPF target. This allows better code and 
better developer experience. Otherwise users will need to manually
recalculate the array size whenever some macro or constant value
changes.

[1] https://lore.kernel.org/bpf/20210809151202.GB1012999@Mem/


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D107882

Files:
  clang/lib/Sema/SemaType.cpp
  clang/test/CodeGen/bpf-vla.c
  llvm/include/llvm/ADT/Triple.h

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D107882.365669.patch
Type: text/x-patch
Size: 3435 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210811/033d3b12/attachment.bin>


More information about the llvm-commits mailing list