aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2020-03-20 16:45:39 -0400
committerJohn McCall <rjmccall@apple.com>2020-03-23 23:24:48 -0400
commit49e5a97ec363a844b167340a82b54a01dc4e671a (patch)
tree93aa84104dc0720ffddee6fb95dcea96c7d53c88 /clang/lib/Frontend/CompilerInvocation.cpp
parent98fa615002826e2e67892df0ee6847fbfa182308 (diff)
downloadllvm-49e5a97ec363a844b167340a82b54a01dc4e671a.zip
llvm-49e5a97ec363a844b167340a82b54a01dc4e671a.tar.gz
llvm-49e5a97ec363a844b167340a82b54a01dc4e671a.tar.bz2
Add an algorithm for performing "optimal" layout of a struct.
The algorithm supports both assigning a fixed offset to a field prior to layout and allowing fields to have sizes that aren't multiples of their required alignments. This means that the well-known algorithm of sorting by decreasing alignment isn't always good enough. Still, we start with that, and only if that leaves padding around do we fall back on a greedy padding-minimizing algorithm. There is no known efficient algorithm for producing a guaranteed-minimal layout in all cases. In fact, allowing arbitrary fixed-offset fields means there's a straightforward reduction from bin-packing, making this NP-hard. But as usual with such problems, we can still efficiently produce adequate solutions to the cases that matter most to us. I intend to use this in coroutine frame layout, where the retcon lowerings very badly want to minimize total space usage, and where the switch lowering can indeed produce a header with interior padding if the promise field is highly-aligned. But it may be useful in a much wider variety of situations.
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
0 files changed, 0 insertions, 0 deletions