dmd
dmd copied to clipboard
Draft: Diagnose aggregate padding using new -vpadding
Got an idea for a small but potentially useful diagnostics for detecting wasted memory, @maxhaton. :)
dmd -vpadding -vcolumns -c -o- main.d
where main.d contains
@safe struct S {
char a;
char b;
char c;
int x;
}
@safe struct T {
char a;
char b;
int x;
}
outputs
main.d(5,9): vpadding: Aligning of field from 3 to 4 bytes wastes 1 byte
main.d(11,10): vpadding: Aligning of field from 2 to 4 bytes wastes 2 bytes
Thanks for your pull request and interest in making D better, @nordlow! We are looking forward to reviewing it, and you should be hearing from a maintainer soon. Please verify that your PR follows this checklist:
- My PR is fully covered with tests (you can see the coverage diff by visiting the details link of the codecov check)
- My PR is as minimal as possible (smaller, focused PRs are easier to review than big ones)
- I have provided a detailed rationale explaining my changes
- New or modified functions have Ddoc comments (with
Params:andReturns:)
Please see CONTRIBUTING.md for more information.
If you have addressed all reviews or aren't sure how to proceed, don't hesitate to ping us with a simple comment.
Bugzilla references
Your PR doesn't reference any Bugzilla issue.
If your PR contains non-trivial changes, please reference a Bugzilla issue or create a manual changelog.
Testing this PR locally
If you don't have a local development environment setup, you can use Digger to test this PR:
dub run digger -- build "master + dmd#13117"
I'm just going to quote @WalterBright on this: https://github.com/dlang/dmd/pull/13106#issuecomment-930016337
I'm just going to quote @WalterBright on this: #13106 (comment)
How many agree that this is a viable strategy for making the D community more vibrant and finally succeed?
Does this mean that GCC/Clang/Rusts/... -Wxxx are bugs?
Ok, let's add -vdiagnose=padding. That's generic enough.
My main motive was to analyze dmd itself with this flag. I would regard it as highly irrational from Walter's side if he turns down a diagnotics that's gonna assist in reducing the memory consumption of the compiler itself.
Anyway, there's always Digger.
Ping, @andralex
How many agree that this is a viable strategy for making the D community more vibrant and finally succeed?
I think it's bad user experience that dmd has tons of flags. Not having the tool at all is not the only alternative to adding it as a compiler flag, this looks like a good fit for a separate tool that uses dmd as a library.
Does this mean that GCC/Clang/Rusts/... -Wxxx are bugs?
I think so. Many warnings that C compilers emit (missing return statement, implicit pointer type casts) should really be errors, and they are in D.
I would regard it as highly irrational from Walter's side if he turns down a diagnotics that's gonna assist in reducing the memory consumption of the compiler itself.
You can use this tool without merging it upstream.
I think so. Many warnings that C compilers emit (missing return statement, implicit pointer type casts) should really be errors, and they are in D.
I'm aware of the binary choice dmd has taken when it comes to avoiding warnings. That is good thing. But -vpadding is not a warning in the traditional sense. It is a diagnostics that's used when performing certain kinds of "detective work" similar to the nature of -vgc, -vtemplates, are. These flags are supposed to be activated temporarily typically when trying to optimize D code in space and time.
Pahole has been doing this for years and works fine today. The only issue is that it hasn't kept up to date with certain modern DWARF constructs, but it works fine for anything to do with structs and classes in D.
I think static assert or pragma(msg) in conjunction with sizeof and offsetof is plenty good:
@safe struct S {
char a;
char b;
char c;
int x;
}
static if (S.sizeof > 7)
pragma(msg, "Layout of S wastes ", S.sizeof - 7, " byte(s).");
@safe struct T {
char a;
char b;
int x;
}
static if (T.sizeof > 6)
pragma(msg, "Layout of T wastes ", T.sizeof - 6, " byte(s).");
output:
Layout of S wastes 1LU byte(s).
Layout of T wastes 2LU byte(s).
Also, this is probably going to be useful to people, but re: dmd memory usage. I didn't find anything particularly egregious inside dmd data structures when just taking padding into account, the issue is that there is just too much stuff being being shoved into very commonly allocated types.
NAME,INSTANCESIZE,HITS,PROD
dmd.dsymbol.DsymbolTable,16,70330,1.125280
dmd.expression.DeclarationExp,48,24268,1.164864
dmd.declaration.TupleDeclaration,216,5549,1.198584
dmd.dtemplate.TypeDeduced,144,8398,1.209312
dmd.attrib.StaticIfDeclaration,162,7525,1.219050
dmd.expression.StringExp,60,20548,1.232880
dmd.mtype.TypeTuple,80,16530,1.322400
dmd.expression.ArrayExp,80,18405,1.472400
dmd.dtemplate.TemplateDeclaration,352,4389,1.544928
dmd.expression.ScopeExp,48,32400,1.555200
dmd.dsymbol.ArrayScopeSymbol,216,7456,1.610496
dmd.statement.CompoundStatement,40,42488,1.699520
dmd.expression.DotIdExp,67,27063,1.813221
dmd.expression.IsExp,76,24113,1.832588
dmd.mtype.TypeTypeof,132,14451,1.907532
dmd.dimport.Import,296,7063,2.090648
dmd.func.UnitTestDeclaration,712,3404,2.423648
dmd.statement.ExpStatement,40,61881,2.475240
dmd.func.FuncLiteralDeclaration,689,4030,2.776670
dmd.init.ExpInitializer,40,76070,3.042800
dmd.expression.VarExp,58,53403,3.097374
dmd.mtype.TypeInstance,128,25204,3.226112
dmd.expression.CastExp,65,63244,4.110860
dmd.expression.IdentifierExp,48,86512,4.152576
dmd.expression.CallExp,88,50670,4.458960
dmd.mtype.Parameter,48,100150,4.807200
dmd.mtype.TypeFunction,128,40171,5.141888
dmd.expression.IntegerExp,48,137942,6.621216
dmd.dsymbol.ScopeDsymbol,200,65567,13.113400
dmd.func.FuncDeclaration,672,21533,14.470176
dmd.declaration.AliasDeclaration,216,71993,15.550488
dmd.declaration.VarDeclaration,305,58208,17.753440
dmd.mtype.TypeIdentifier,136,149961,20.394696
dmd.dtemplate.TemplateInstance,379,74837,28.363223
Here is some random data on class allocations inside dmd. Notice how something many things which are basically a string with some metadata, actually have very large instance size because they inherit from things like we are still programming in 1999.
https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance
Now, pahole again: The output will do look something like this. This is dmd's debug info after compiling itself.
struct _Array_char {
ulong length; /* 0 4 */
/* XXX 4 bytes hole, try to pack */
const char * ptr; /* 8 8 */
/* size: 16, cachelines: 1, members: 2 */
/* sum members: 12, holes: 1, sum holes: 4 */
/* last cacheline: 16 bytes */
};
struct dmd.root.stringtable.StringEntry {
uint hash; /* 0 4 */
uint vptr; /* 4 4 */
/* size: 8, cachelines: 1, members: 2 */
/* last cacheline: 8 bytes */
};
struct _Array_struct {
ulong length; /* 0 4 */
/* XXX 4 bytes hole, try to pack */
struct dmd.root.stringtable.StringEntry * ptr; /* 8 8 */
/* size: 16, cachelines: 1, members: 2 */
/* sum members: 12, holes: 1, sum holes: 4 */
/* last cacheline: 16 bytes */
};
struct _Array_* {
ulong length; /* 0 4 */
/* XXX 4 bytes hole, try to pack */
ubyte * * ptr; /* 8 8 */
/* size: 16, cachelines: 1, members: 2 */
/* sum members: 12, holes: 1, sum holes: 4 */
/* last cacheline: 16 bytes */
};
struct dmd.root.stringtable.StringTable!(char*).StringTable {
struct _Array_struct table; /* 0 16 */
struct _Array_* pools; /* 16 16 */
uint long long nfill; /* 32 8 */
uint long long count; /* 40 8 */
uint long long countTrigger; /* 48 8 */
/* size: 56, cachelines: 1, members: 5 */
/* last cacheline: 56 bytes */
};
//etc
The keen eyed observer of my previous comment may notice that dmd debug info is ~~crap~~ subpar, e.g. in this short example we can see that even on a 64 bit target the sizeof the length of an array is wrong. I fixed this in #13081
Layout of S wastes 1LU byte(s). Layout of T wastes 2LU byte(s).
Thanks. However, this is personally not a question of what's possible but of what's at all convenient and likely that developers are gonna use and in the long-term what's gonna attract more people to the D community. Tooling is what's we're severly lagging behind compared to languages such as Rust.
I suggest you try this feature out on your own code via for instance Digger before closing this.
However, this is personally not a question of what's possible but of what's at all convenient and likely that developers are gonna use and in the long-term what's gonna attract more people to the D community.
I speculate that
- figuring out where holes in a layout are is a very specialized, niche need
- when needed, it's only for select few types
- when needed, the form of a warning is the least useful
- it's a feature for which convenience is not a factor
- it's a feature that awkwardly duplicates what's already available in a much better programmatic form
- it's highly unlikely the addition would make anyone like the language more
For my money I wouldn't mind some simple library primitives in std.traits (totalPadding!S would yield the cumulative padding in struct S), but even those come with a low work/reward ratio.
It's trivially done with core.reflect. https://forum.dlang.org/thread/[email protected]
I think
static assertorpragma(msg)in conjunction withsizeofandoffsetofis plenty good:@safe struct S { char a; char b; char c; int x; } static if (S.sizeof > 7) pragma(msg, "Layout of S wastes ", S.sizeof - 7, " byte(s)."); @safe struct T { char a; char b; int x; } static if (T.sizeof > 6) pragma(msg, "Layout of T wastes ", T.sizeof - 6, " byte(s).");output:
Layout of S wastes 1LU byte(s). Layout of T wastes 2LU byte(s).
But you pulled the numbers 7 and 6 respectively out of your hat. How do you compute those automatically?
I'll leave the completed version here that also tells you where the padding is
// detect padding in aggregates
import core.reflect.reflect;
import core.reflect.transitiveVisitor;
import std_stdio = std.stdio;
struct PadDetctedTuple
{
string aggregateName;
Location aggregateLocation;
ulong number_of_pad_bytes;
string msg;
}
struct S
{
ubyte a; // <--- is at offset 0
ubyte b; // <--- is at offset 1
uint d; // <--- is at offset 4
}
static assert(S.init.a.offsetof == 0);
static assert(S.init.b.offsetof == 1);
static assert(S.init.d.offsetof == 4);
static immutable sc = currentScope();
static immutable node = nodeFromName("S", ReflectFlags.Members | ReflectFlags.MemberRecursion, sc);
static immutable stdio_n = nodeFromName("std_stdio", ReflectFlags.Members | ReflectFlags.MemberRecursion, sc);
void main()
{
import std.stdio;
foreach(p; detectPadding(stdio_n))
{
writeln(p.aggregateName, " -- ", p.aggregateLocation.filename, ":", p.aggregateLocation.line, p.msg);
}
foreach(p; detectPadding(node))
{
writeln(p.aggregateName, " -- ", p.aggregateLocation.filename, ":", p.aggregateLocation.line, p.msg);
}
}
PadDetctedTuple[] detectPadding(const Node n)
{
class PadDetectVisitor : TransitiveVisitor
{
import std.format;
alias visit = TransitiveVisitor.visit;
override void visit(StructDeclaration ad)
{
ulong lastOffset;
ulong lastSize;
ulong wastedBytes;
string lastFieldName;
string msg;
foreach(f;ad.fields)
{
const waste = ((f.offset - lastOffset) - lastSize);
wastedBytes += waste;
if (waste)
{
msg ~= "\n\t%d bytes of waste between %s and %s".format(waste, lastFieldName, f.name);
}
lastOffset = f.offset;
lastSize = f.type.size;
lastFieldName = f.name;
}
if (wastedBytes)
pads ~= PadDetctedTuple(ad.name, ad.location, wastedBytes, msg);
}
override void visit(ClassDeclaration cd)
{
ulong lastOffset = 16; // class metadata is 16 bytes
ulong lastSize;
ulong wastedBytes;
string lastFieldName;
string msg;
// for classes we need to keep a stack of bases
// let's go!
ClassDeclaration[] baseStack = [cd];
for(auto base = cd.base; base; base = base.base)
{
baseStack ~= base;
}
foreach_reverse(base;baseStack)
{
foreach(f;base.fields)
{
const waste = ((f.offset - lastOffset) - lastSize);
wastedBytes += waste;
if (waste)
{
msg ~= "%d bytes of waste between %s and %s\n".format(waste, lastFieldName, f.name);
}
lastOffset = f.offset;
lastSize = f.type.size;
lastFieldName = f.name;
}
}
if (wastedBytes)
pads ~= PadDetctedTuple(cd.name, cd.location, wastedBytes, msg);
}
PadDetctedTuple[] pads;
}
scope padDetector = new PadDetectVisitor();
(cast()n).accept(padDetector);
return padDetector.pads;
}
```
output:
```
_IO_FILE -- generated/linux/release/64/../../../../../druntime/import/core/stdc/stdio.d:411
4 bytes of waste between _flags and _read_ptr
4 bytes of waste between _shortbuf and _lock
_IO_FILE -- generated/linux/release/64/../../../../../druntime/import/core/stdc/stdio.d:411
4 bytes of waste between _flags and _read_ptr
4 bytes of waste between _shortbuf and _lock
S -- pad.d:15
2 bytes of waste between b and d
```
It's trivially done with core.reflect. https://forum.dlang.org/thread/[email protected]
Again, this is not about what's possible, it's about what's trivial for any user, newbies included, to just activate for all the sources (or current file of editing in a check setup such as Emacs+FlyCheck) with unnoticeble-overhead for the compiler.
Feel free to do whatever you want with this. Personally it doesn't matter as I'm using my own handcraft Digger-like script that recompiles dmd and applies the patches I want, this included, when I want the diagnostics.
It's trivially done with core.reflect. https://forum.dlang.org/thread/[email protected]
Again, this is not about what's possible, it's about what's trivial for any user, newbies included, to just activate for all the sources (or current files of editing).
Feel free to do whatever you want with this. Personally it doesn't matter as I'm using my own handcraft Digger-like script that recompiles dmd and applies the patches I want, this included, when I want the diagnostics.
I strongly agree. Core.reflect is very cool but this is now, that could well be D's future but not yet.
Awkward, but simple and can be simplified and packaged further: https://run.dlang.io/is/NLOSNA
Awkward, but simple and can be simplified and packaged further: https://run.dlang.io/is/NLOSNA
@andralex Do you mind if I use this as example code to contrast it with core.reflect for my presentation?
no problem!
good to keep in mind that it's a quick and dirty proof of concept
Checking padding of DMD sources:
src/dmd/checkpadding.d:
import dmd.ast_node;
import dmd.attrib;
import dmd.aliasthis;
import dmd.aggregate;
import dmd.complex;
import dmd.cond;
import dmd.ctfeexpr;
import dmd.dclass;
import dmd.declaration;
import dmd.denum;
import dmd.dimport;
import dmd.declaration;
import dmd.dstruct;
import dmd.dsymbol;
import dmd.dtemplate;
import dmd.dversion;
import dmd.expression;
import dmd.func;
import dmd.denum;
import dmd.dimport;
import dmd.dmodule;
import dmd.mtype;
import dmd.typinf;
import dmd.identifier;
import dmd.init;
import dmd.doc;
import dmd.root.rootobject;
import dmd.statement;
import dmd.staticassert;
import dmd.nspace;
import dmd.visitor;
size_t checkPadding(S)() {
size_t result = 0;
enum sizes = {
size_t[] r;
static foreach (f; S.tupleof) r ~= f.offsetof;
return r;
}();
enum offsets = {
size_t[] r;
static foreach (f; S.tupleof) r ~= f.sizeof;
return r;
}();
static foreach (i, f; S.tupleof) {
static if (i > 0) {
static if (f.offsetof > offsets[i - 1] + sizes[i - 1])
pragma(msg, "Field ", i, " of ", S.stringof, " wastes ", f.offsetof - offsets[i - 1] - sizes[i - 1], " byte(s).");
}
}
return result;
}
void main()
{
foreach (ov; __traits(getOverloads, Visitor, "visit"))
static if (is(typeof(ov) P == function))
alias x = checkPadding!(P[0]);
}
Inside 'src' directory run:
dmd -c -version=MARS -Jdmd/res -J.. dmd/checkpadding.d
Output:
Field 10LU of Dsymbol wastes 3LU byte(s).
Field 12LU of Dsymbol wastes 6LU byte(s).
Field 2LU of Type wastes 6LU byte(s).
Field 3LU of Expression wastes 4LU byte(s).
Field 5LU of Declaration wastes 1LU byte(s).
Field 7LU of Declaration wastes 3LU byte(s).
Field 3LU of ScopeDsymbol wastes 4LU byte(s).
Field 4LU of Import wastes 4LU byte(s).
Field 8LU of EnumDeclaration wastes 2LU byte(s).
Field 8LU of AggregateDeclaration wastes 6LU byte(s).
Field 27LU of AggregateDeclaration wastes 5LU byte(s).
Field 14LU of TemplateDeclaration wastes 2LU byte(s).
Field 16LU of TemplateDeclaration wastes 4LU byte(s).
Field 16LU of FuncDeclaration wastes 7LU byte(s).
Field 31LU of FuncDeclaration wastes 1LU byte(s).
Field 34LU of FuncDeclaration wastes 6LU byte(s).
Field 37LU of FuncDeclaration wastes 7LU byte(s).
Field 39LU of FuncDeclaration wastes 7LU byte(s).
Field 42LU of FuncDeclaration wastes 3LU byte(s).
Field 47LU of FuncDeclaration wastes 3LU byte(s).
Field 49LU of FuncDeclaration wastes 7LU byte(s).
Field 54LU of FuncDeclaration wastes 4LU byte(s).
Field 2LU of TupleDeclaration wastes 7LU byte(s).
Field 1LU of FuncLiteralDeclaration wastes 6LU byte(s).
Field 1LU of AnonDeclaration wastes 3LU byte(s).
Field 4LU of StaticForeachDeclaration wastes 6LU byte(s).
Field 14LU of Module wastes 3LU byte(s).
Field 24LU of Module wastes 4LU byte(s).
Field 28LU of Module wastes 4LU byte(s).
Field 31LU of Module wastes 4LU byte(s).
Field 38LU of Module wastes 4LU byte(s).
Field 7LU of StructDeclaration wastes 1LU byte(s).
Field 14LU of StructDeclaration wastes 3LU byte(s).
Field 11LU of ClassDeclaration wastes 2LU byte(s).
Field 15LU of ClassDeclaration wastes 5LU byte(s).
Field 1LU of ForeachRangeStatement wastes 4LU byte(s).
Field 1LU of ForeachStatement wastes 4LU byte(s).
Field 1LU of ScopeGuardStatement wastes 4LU byte(s).
Field 3LU of SwitchStatement wastes 7LU byte(s).
Field 3LU of CaseStatement wastes 4LU byte(s).
Field 4LU of GccAsmStatement wastes 4LU byte(s).
Field 2LU of TypeTag wastes 6LU byte(s).
Field 2LU of TypeFunction wastes 3LU byte(s).
Field 6LU of TypeFunction wastes 5LU byte(s).
Field 5LU of CallExp wastes 5LU byte(s).
Field 1LU of ExpInitializer wastes 6LU byte(s).
Field 3LU of ArrayInitializer wastes 4LU byte(s).
Field 2LU of DelegateExp wastes 7LU byte(s).
good to keep in mind that it's a quick and dirty proof of concept
Thanks I will present it as such.
Checking padding of DMD sources:
src/dmd/checkpadding.d: [ .... ]
I fear your list if very incomplete. Here is a part of the transitive scan from core.reflect.
Dsymbol -- src/dmd/dsymbol.d:240
3 bytes of waste between errors and semanticRun
4 bytes of waste between semanticRun and localNum
6 bytes of waste between localNum and depdecl
Identifier -- src/dmd/identifier.d:29
3 bytes of waste between isAnonymous_ and name
Identifier -- src/dmd/identifier.d:29
3 bytes of waste between isAnonymous_ and name
Global -- src/dmd/globals.d:283
4 bytes of waste between gaggedWarnings and console.
Param -- src/dmd/globals.d:102
1 bytes of waste between useDeprecated and stackstomp.
1 bytes of waste between useDIP25 and useDIP1000.
1 bytes of waste between useDIP1000 and useDIP1021.
1 bytes of waste between warnings and pic.
1 bytes of waste between pic and color.
1 bytes of waste between dtorFields and fieldwise.
3 bytes of waste between rvalueRefParam and cplusplus.
4 bytes of waste between cplusplus and markdown.
1 bytes of waste between useInvariants and useIn.
1 bytes of waste between useIn and useOut.
1 bytes of waste between useOut and useArrayBounds.
1 bytes of waste between useArrayBounds and useAssert.
1 bytes of waste between useAssert and useSwitchError.
1 bytes of waste between useSwitchError and boundscheck.
1 bytes of waste between boundscheck and checkAction.
2 bytes of waste between checkAction and errorLimit.
7 bytes of waste between doDocComments and docdir.
7 bytes of waste between doHdrGeneration and hdrdir.
3 bytes of waste between hdrStripPlainFunctions and doCxxHdrGeneration.
4 bytes of waste between doCxxHdrGeneration and cxxhdrdir.
7 bytes of waste between doJsonGeneration and jsonfilename.
8 bytes of waste between jsonFieldFlags and mixinOut.
4 bytes of waste between versionlevel and versionids.
7 bytes of waste between emitMakeDeps and makeDepsFile.
1 bytes of waste between messageStyle and run.
6 bytes of waste between run and runargs.
OutBuffer -- src/dmd/root/outbuffer.d:30
7 bytes of waste between notlinehead and fileMapping.
2 bytes of waste between spaces and level.
FileMapping -- src/dmd/root/file.d:34
This is not the full list as it is to big to paste.
and this is the driver code you need to make this happen:
import DMD_VISITOR = dmd.visitor;
import core.reflect.reflect;
import core.reflect.transitiveVisitor;
static immutable pad_funcs = nodeFromName("DMD_VISITOR", ReflectFlags.Members | ReflectFlags.MemberRecursion | ReflectFlags.Functionbody);
void main()
{
import std.stdio;
foreach(p; detectPadding(pad_funcs))
{
writeln(p.aggregateName, " -- ", p.aggregateLocation.filename, ":", p.aggregateLocation.line, "\n ", p.msg);
}
}
As build.d filters away non-error diagnostics I tried running the two calls to dmd explicitly
which gives for backend
/home/per/Work/dmd/src/dmd/backend/cdef.d(778): vpadding: Aligning of field `csegname` from 2 to 8 bytes wastes 6 bytes
/home/per/Work/dmd/src/dmd/backend/cdef.d(712): vpadding: Aligning of field `_version` from 1 to 8 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/backend/cdef.d(719): vpadding: Aligning of field `versionint` from 29 to 30 bytes wastes 1 byte
/home/per/Work/dmd/src/dmd/backend/cdef.d(724): vpadding: Aligning of field `wflags` from 39 to 40 bytes wastes 1 byte
/home/per/Work/dmd/src/dmd/backend/cdef.d(732): vpadding: Aligning of field `memmodel` from 47 to 48 bytes wastes 1 byte
/home/per/Work/dmd/src/dmd/backend/cdef.d(733): vpadding: Aligning of field `objfmt` from 50 to 52 bytes wastes 2 bytes
/home/per/Work/dmd/src/dmd/backend/cdef.d(747): vpadding: Aligning of field `threshold` from 86 to 88 bytes wastes 2 bytes
src/dmd/backend/dvarstats.d(84): vpadding: Aligning of field `lineOffsets` from 76 to 80 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/iasm.d(504): vpadding: Aligning of field `ptb` from 9 to 16 bytes wastes 7 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/object.d(1492): vpadding: Aligning of field `deallocator` from 108 to 112 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/object.d(1842): vpadding: Aligning of field `__anonymous` from 84 to 88 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/object.d(1861): vpadding: Aligning of field `m_arg1` from 108 to 112 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/object.d(2599): vpadding: Aligning of field `bypassedException` from 76 to 80 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/stdc/time.d(48): vpadding: Aligning of field `tm_gmtoff` from 36 to 40 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/stdc/stdio.d(414): vpadding: Aligning of field `_read_ptr` from 4 to 8 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/stdc/stdio.d(433): vpadding: Aligning of field `_lock` from 132 to 136 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/dlist.d(41): vpadding: Aligning of field `__anonymous` from 12 to 16 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/el.d(85): vpadding: Aligning of field `__anonymous` from 35 to 36 bytes wastes 1 byte
/home/per/Work/dmd/src/dmd/backend/el.d(124): vpadding: Aligning of field `ET` from 50 to 56 bytes wastes 6 bytes
/home/per/Work/dmd/src/dmd/backend/type.d(86): vpadding: Aligning of field `Tcount` from 7 to 8 bytes wastes 1 byte
/home/per/Work/dmd/src/dmd/backend/type.d(87): vpadding: Aligning of field `Tident` from 12 to 16 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/code.d(175): vpadding: Aligning of field `funcarg` from 4 to 8 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/code.d(239): vpadding: Aligning of field `SDoffset` from 4 to 8 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/code.d(245): vpadding: Aligning of field `segidx` from 21 to 24 bytes wastes 3 bytes
/home/per/Work/dmd/src/dmd/backend/code.d(251): vpadding: Aligning of field `ledata` from 52 to 56 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/code.d(256): vpadding: Aligning of field `SDbuf` from 68 to 72 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/code.d(284): vpadding: Aligning of field `linoff` from 12 to 16 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(309): vpadding: Aligning of field `STinexp` from 11 to 12 bytes wastes 1 byte
/home/per/Work/dmd/src/dmd/backend/cc.d(315): vpadding: Aligning of field `STbfilter` from 18 to 24 bytes wastes 6 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(345): vpadding: Aligning of field `STclasssym` from 45 to 48 bytes wastes 3 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(352): vpadding: Aligning of field `STgclass` from 82 to 84 bytes wastes 2 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(361): vpadding: Aligning of field `STlastfunc` from 124 to 128 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(443): vpadding: Aligning of field `tryblock` from 44 to 48 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(559): vpadding: Aligning of field `Bcode` from 84 to 88 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(578): vpadding: Aligning of field `Binitvar` from 28 to 32 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(566): vpadding: Aligning of field `__anonymous` from 108 to 112 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(775): vpadding: Aligning of field `Fparsescope` from 89 to 96 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(795): vpadding: Aligning of field `__anonymous` from 164 to 168 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(875): vpadding: Aligning of field `BCpublics` from 26 to 32 bytes wastes 6 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(881): vpadding: Aligning of field `BCparent` from 60 to 64 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(904): vpadding: Aligning of field `MPf` from 4 to 8 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(933): vpadding: Aligning of field `temp_arglist2` from 52 to 56 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(971): vpadding: Aligning of field `name` from 1 to 8 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1003): vpadding: Aligning of field `TMmemberfuncs` from 28 to 32 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1009): vpadding: Aligning of field `TMflags` from 65 to 68 bytes wastes 3 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1035): vpadding: Aligning of field `SEalias` from 4 to 8 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1083): vpadding: Aligning of field `Sflags` from 29 to 32 bytes wastes 3 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1087): vpadding: Aligning of field `Snonvirtsize` from 42 to 48 bytes wastes 6 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1265): vpadding: Aligning of field `Stype` from 36 to 40 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1283): vpadding: Aligning of field `Slabelblk_` from 4 to 8 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1310): vpadding: Aligning of field `Smemoff` from 2 to 8 bytes wastes 6 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1409): vpadding: Aligning of field `Sflags` from 90 to 92 bytes wastes 2 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1434): vpadding: Aligning of field `Sregm` from 2 to 4 bytes wastes 2 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1747): vpadding: Aligning of field `EEexpr` from 4 to 8 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1753): vpadding: Aligning of field `EEelem` from 28 to 32 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1783): vpadding: Aligning of field `ptal` from 23 to 24 bytes wastes 1 byte
/home/per/Work/dmd/src/dmd/backend/cc.d(1785): vpadding: Aligning of field `hasExcSpec` from 33 to 36 bytes wastes 3 bytes
/home/per/Work/dmd/src/dmd/backend/cc.d(1818): vpadding: Aligning of field `__anonymous` from 12 to 16 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/code_x86.d(377): vpadding: Aligning of field `IEV1` from 22 to 24 bytes wastes 2 bytes
/home/per/Work/dmd/src/dmd/backend/code_x86.d(571): vpadding: Aligning of field `save` from 132 to 136 bytes wastes 4 bytes
src/dmd/backend/goh.d(87): vpadding: Aligning of field `dnunambig` from 36 to 40 bytes wastes 4 bytes
src/dmd/backend/goh.d(91): vpadding: Aligning of field `expblk` from 92 to 96 bytes wastes 4 bytes
src/dmd/backend/gsroa.d(59): vpadding: Aligning of field `ty` from 2 to 4 bytes wastes 2 bytes
src/dmd/backend/gsroa.d(60): vpadding: Aligning of field `si0` from 12 to 16 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/cgcv.d(61): vpadding: Aligning of field `list` from 4 to 8 bytes wastes 4 bytes
src/dmd/backend/cgsched.d(92): vpadding: Aligning of field `r` from 15 to 16 bytes wastes 1 byte
src/dmd/backend/cgsched.d(97): vpadding: Aligning of field `sibmodrm` from 30 to 32 bytes wastes 2 bytes
src/dmd/backend/cgsched.d(2252): vpadding: Aligning of field `cinfo` from 964 to 968 bytes wastes 4 bytes
src/dmd/backend/cgsched.d(2255): vpadding: Aligning of field `stagelist` from 6732 to 6736 bytes wastes 4 bytes
src/dmd/backend/cg87.d(88): vpadding: Aligning of field `roundto0` from 4 to 8 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/backend/melf.d(314): vpadding: Aligning of field `DBvalu` from 14 to 16 bytes wastes 2 bytes
src/dmd/backend/cod1.d(2926): vpadding: Aligning of field `numalign` from 10 to 12 bytes wastes 2 bytes
src/dmd/backend/cv8.d(113): vpadding: Aligning of field `srcfilename` from 12 to 16 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/signal.d(582): vpadding: Aligning of field `sa_restorer` from 140 to 144 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/signal.d(930): vpadding: Aligning of field `si_utime` from 12 to 16 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/signal.d(946): vpadding: Aligning of field `_sifields` from 12 to 16 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/signal.d(2144): vpadding: Aligning of field `ss_size` from 12 to 16 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/fcntl.d(277): vpadding: Aligning of field `l_start` from 4 to 8 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/pthread.d(464): vpadding: Aligning of field `__prev` from 20 to 24 bytes wastes 4 bytes
src/dmd/backend/mscoffobj.d(162): vpadding: Aligning of field `val` from 29 to 30 bytes wastes 1 byte
src/dmd/backend/newman.d(81): vpadding: Aligning of field `np` from 1802 to 1808 bytes wastes 6 bytes
src/dmd/backend/newman.d(87): vpadding: Aligning of field `arg` from 1900 to 1904 bytes wastes 4 bytes
src/dmd/backend/newman.d(142): vpadding: Aligning of field `string` from 2 to 8 bytes wastes 6 bytes
src/dmd/backend/cgobj.d(277): vpadding: Aligning of field `typidx` from 1051 to 1052 bytes wastes 1 byte
src/dmd/backend/cgobj.d(375): vpadding: Aligning of field `startaddress` from 76 to 80 bytes wastes 4 bytes
src/dmd/backend/cgobj.d(414): vpadding: Aligning of field `CODE16offset` from 2220 to 2224 bytes wastes 4 bytes
src/dmd/backend/cgcse.d(149): vpadding: Aligning of field `this` from 12 to 16 bytes wastes 4 bytes
src/dmd/root/file.d(464): vpadding: Aligning of field `buffer` from 1 to 8 bytes wastes 7 bytes
src/dmd/root/file.d(48): vpadding: Aligning of field `data` from 4 to 8 bytes wastes 4 bytes
src/dmd/root/outbuffer.d(41): vpadding: Aligning of field `fileMapping` from 25 to 32 bytes wastes 7 bytes
src/dmd/root/outbuffer.d(47): vpadding: Aligning of field `level` from 42 to 44 bytes wastes 2 bytes
src/dmd/globals.d(170): vpadding: Aligning of field `cplusplus` from 54 to 56 bytes wastes 2 bytes
src/dmd/globals.d(199): vpadding: Aligning of field `errorLimit` from 83 to 84 bytes wastes 1 byte
src/dmd/globals.d(210): vpadding: Aligning of field `docdir` from 201 to 208 bytes wastes 7 bytes
src/dmd/globals.d(215): vpadding: Aligning of field `hdrdir` from 273 to 280 bytes wastes 7 bytes
src/dmd/globals.d(219): vpadding: Aligning of field `doCxxHdrGeneration` from 313 to 316 bytes wastes 3 bytes
src/dmd/globals.d(224): vpadding: Aligning of field `jsonfilename` from 353 to 360 bytes wastes 7 bytes
src/dmd/globals.d(227): vpadding: Aligning of field `mixinOut` from 380 to 384 bytes wastes 4 bytes
src/dmd/globals.d(235): vpadding: Aligning of field `versionids` from 420 to 424 bytes wastes 4 bytes
src/dmd/globals.d(245): vpadding: Aligning of field `makeDepsFile` from 505 to 512 bytes wastes 7 bytes
src/dmd/globals.d(251): vpadding: Aligning of field `runargs` from 562 to 568 bytes wastes 6 bytes
src/dmd/globals.d(306): vpadding: Aligning of field `console` from 924 to 928 bytes wastes 4 bytes
src/dmd/root/region.d(31): vpadding: Aligning of field `available` from 36 to 40 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/object.d(1492): vpadding: Aligning of field `deallocator` from 108 to 112 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/object.d(1842): vpadding: Aligning of field `__anonymous` from 84 to 88 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/object.d(1861): vpadding: Aligning of field `m_arg1` from 108 to 112 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/object.d(2599): vpadding: Aligning of field `bypassedException` from 76 to 80 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/stdc/time.d(48): vpadding: Aligning of field `tm_gmtoff` from 36 to 40 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/stdc/stdio.d(414): vpadding: Aligning of field `_read_ptr` from 4 to 8 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/stdc/stdio.d(433): vpadding: Aligning of field `_lock` from 132 to 136 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/exception.d(503): vpadding: Aligning of field `idx` from 76 to 80 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/signal.d(582): vpadding: Aligning of field `sa_restorer` from 140 to 144 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/signal.d(930): vpadding: Aligning of field `si_utime` from 12 to 16 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/signal.d(946): vpadding: Aligning of field `_sifields` from 12 to 16 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/signal.d(2144): vpadding: Aligning of field `ss_size` from 12 to 16 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/fcntl.d(277): vpadding: Aligning of field `l_start` from 4 to 8 bytes wastes 4 bytes
src/dmd/tokens.d(521): vpadding: Aligning of field `blockComment` from 34 to 40 bytes wastes 6 bytes
src/dmd/tokens.d(524): vpadding: Aligning of field `__anonymous` from 72 to 80 bytes wastes 8 bytes
src/dmd/identifier.d(36): vpadding: Aligning of field `name` from 13 to 16 bytes wastes 3 bytes
src/dmd/lexer.d(222): vpadding: Aligning of field `token` from 56 to 64 bytes wastes 8 bytes
src/dmd/lexer.d(234): vpadding: Aligning of field `base` from 164 to 168 bytes wastes 4 bytes
src/dmd/lexer.d(241): vpadding: Aligning of field `inTokenStringConstant` from 195 to 196 bytes wastes 1 byte
src/dmd/lexer.d(244): vpadding: Aligning of field `tokenFreelist` from 204 to 208 bytes wastes 4 bytes
src/dmd/root/region.d(39): vpadding: Aligning of field `available` from 4 to 8 bytes wastes 4 bytes
src/dmd/root/file.d(48): vpadding: Aligning of field `data` from 4 to 8 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/root/file.d(464): vpadding: Aligning of field `buffer` from 1 to 8 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/root/file.d(48): vpadding: Aligning of field `data` from 4 to 8 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/root/outbuffer.d(41): vpadding: Aligning of field `fileMapping` from 25 to 32 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/root/outbuffer.d(47): vpadding: Aligning of field `level` from 42 to 44 bytes wastes 2 bytes
/home/per/Work/dmd/src/dmd/globals.d(170): vpadding: Aligning of field `cplusplus` from 54 to 56 bytes wastes 2 bytes
/home/per/Work/dmd/src/dmd/globals.d(199): vpadding: Aligning of field `errorLimit` from 83 to 84 bytes wastes 1 byte
/home/per/Work/dmd/src/dmd/globals.d(210): vpadding: Aligning of field `docdir` from 201 to 208 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/globals.d(215): vpadding: Aligning of field `hdrdir` from 273 to 280 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/globals.d(219): vpadding: Aligning of field `doCxxHdrGeneration` from 313 to 316 bytes wastes 3 bytes
/home/per/Work/dmd/src/dmd/globals.d(224): vpadding: Aligning of field `jsonfilename` from 353 to 360 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/globals.d(227): vpadding: Aligning of field `mixinOut` from 380 to 384 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/globals.d(235): vpadding: Aligning of field `versionids` from 420 to 424 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/globals.d(245): vpadding: Aligning of field `makeDepsFile` from 505 to 512 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/globals.d(251): vpadding: Aligning of field `runargs` from 562 to 568 bytes wastes 6 bytes
/home/per/Work/dmd/src/dmd/globals.d(306): vpadding: Aligning of field `console` from 924 to 928 bytes wastes 4 bytes
src/dmd/backend/cdef.d(712): vpadding: Aligning of field `_version` from 1 to 8 bytes wastes 7 bytes
src/dmd/backend/cdef.d(719): vpadding: Aligning of field `versionint` from 29 to 30 bytes wastes 1 byte
src/dmd/backend/cdef.d(724): vpadding: Aligning of field `wflags` from 39 to 40 bytes wastes 1 byte
src/dmd/backend/cdef.d(732): vpadding: Aligning of field `memmodel` from 47 to 48 bytes wastes 1 byte
src/dmd/backend/cdef.d(733): vpadding: Aligning of field `objfmt` from 50 to 52 bytes wastes 2 bytes
src/dmd/backend/cdef.d(747): vpadding: Aligning of field `threshold` from 86 to 88 bytes wastes 2 bytes
src/dmd/backend/cdef.d(778): vpadding: Aligning of field `csegname` from 2 to 8 bytes wastes 6 bytes
src/dmd/dsymbol.d(140): vpadding: Aligning of field `pkg` from 1 to 8 bytes wastes 7 bytes
src/dmd/ob.d(111): vpadding: Aligning of field `index` from 81 to 84 bytes wastes 3 bytes
/home/per/Work/dmd/src/dmd/root/region.d(31): vpadding: Aligning of field `available` from 36 to 40 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/root/stringtable.d(58): vpadding: Aligning of field `length` from 1 to 8 bytes wastes 7 bytes
src/dmd/expression.d(668): vpadding: Aligning of field `type` from 12 to 16 bytes wastes 4 bytes
src/dmd/expression.d(2045): vpadding: Aligning of field `value` from 40 to 48 bytes wastes 8 bytes
src/dmd/expression.d(2120): vpadding: Aligning of field `value` from 40 to 48 bytes wastes 8 bytes
src/dmd/expression.d(3612): vpadding: Aligning of field `offset` from 57 to 64 bytes wastes 7 bytes
src/dmd/dclass.d(48): vpadding: Aligning of field `vtbl` from 20 to 24 bytes wastes 4 bytes
src/dmd/backend/iasm.d(504): vpadding: Aligning of field `ptb` from 9 to 16 bytes wastes 7 bytes
src/dmd/iasmdmd.d(360): vpadding: Aligning of field `ty` from 17 to 20 bytes wastes 3 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/object.d(1492): vpadding: Aligning of field `deallocator` from 108 to 112 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/object.d(1842): vpadding: Aligning of field `__anonymous` from 84 to 88 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/object.d(1861): vpadding: Aligning of field `m_arg1` from 108 to 112 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/object.d(2599): vpadding: Aligning of field `bypassedException` from 76 to 80 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/stdc/stdio.d(414): vpadding: Aligning of field `_read_ptr` from 4 to 8 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/stdc/stdio.d(433): vpadding: Aligning of field `_lock` from 132 to 136 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/stdc/time.d(48): vpadding: Aligning of field `tm_gmtoff` from 36 to 40 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/signal.d(582): vpadding: Aligning of field `sa_restorer` from 140 to 144 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/signal.d(930): vpadding: Aligning of field `si_utime` from 12 to 16 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/signal.d(946): vpadding: Aligning of field `_sifields` from 12 to 16 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/signal.d(2144): vpadding: Aligning of field `ss_size` from 12 to 16 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/exception.d(503): vpadding: Aligning of field `idx` from 76 to 80 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/sys/posix/fcntl.d(277): vpadding: Aligning of field `l_start` from 4 to 8 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/tokens.d(521): vpadding: Aligning of field `blockComment` from 34 to 40 bytes wastes 6 bytes
/home/per/Work/dmd/src/dmd/tokens.d(524): vpadding: Aligning of field `__anonymous` from 72 to 80 bytes wastes 8 bytes
/home/per/Work/dmd/src/dmd/identifier.d(36): vpadding: Aligning of field `name` from 13 to 16 bytes wastes 3 bytes
src/dmd/ctorflow.d(34): vpadding: Aligning of field `loc` from 2 to 8 bytes wastes 6 bytes
src/dmd/ctorflow.d(44): vpadding: Aligning of field `fieldinit` from 2 to 8 bytes wastes 6 bytes
src/dmd/dsymbol.d(253): vpadding: Aligning of field `semanticRun` from 89 to 92 bytes wastes 3 bytes
src/dmd/dsymbol.d(256): vpadding: Aligning of field `depdecl` from 98 to 104 bytes wastes 6 bytes
src/dmd/dimport.d(38): vpadding: Aligning of field `visibility` from 164 to 168 bytes wastes 4 bytes
src/dmd/sapply.d(38): vpadding: Aligning of field `v` from 9 to 16 bytes wastes 7 bytes
src/dmd/statement.d(426): vpadding: Aligning of field `s` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(446): vpadding: Aligning of field `exp` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(511): vpadding: Aligning of field `exps` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(541): vpadding: Aligning of field `statements` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(656): vpadding: Aligning of field `statements` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(694): vpadding: Aligning of field `statement` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(743): vpadding: Aligning of field `sym` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(779): vpadding: Aligning of field `param` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(822): vpadding: Aligning of field `_body` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(863): vpadding: Aligning of field `_init` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(921): vpadding: Aligning of field `op` from 25 to 26 bytes wastes 1 byte
src/dmd/statement.d(922): vpadding: Aligning of field `parameters` from 28 to 32 bytes wastes 4 bytes
src/dmd/statement.d(975): vpadding: Aligning of field `op` from 25 to 26 bytes wastes 1 byte
src/dmd/statement.d(976): vpadding: Aligning of field `prm` from 28 to 32 bytes wastes 4 bytes
src/dmd/statement.d(1021): vpadding: Aligning of field `prm` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1059): vpadding: Aligning of field `condition` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1096): vpadding: Aligning of field `sfe` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1120): vpadding: Aligning of field `ident` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1148): vpadding: Aligning of field `sa` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1172): vpadding: Aligning of field `condition` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1176): vpadding: Aligning of field `sdefault` from 49 to 56 bytes wastes 7 bytes
src/dmd/statement.d(1254): vpadding: Aligning of field `exp` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1258): vpadding: Aligning of field `lastVar` from 52 to 56 bytes wastes 4 bytes
src/dmd/statement.d(1284): vpadding: Aligning of field `first` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1312): vpadding: Aligning of field `statement` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1338): vpadding: Aligning of field `sw` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1361): vpadding: Aligning of field `exp` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1386): vpadding: Aligning of field `exp` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1410): vpadding: Aligning of field `exp` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1440): vpadding: Aligning of field `ident` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1464): vpadding: Aligning of field `ident` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1488): vpadding: Aligning of field `exp` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1524): vpadding: Aligning of field `exp` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1553): vpadding: Aligning of field `_body` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1624): vpadding: Aligning of field `_body` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1669): vpadding: Aligning of field `tok` from 25 to 26 bytes wastes 1 byte
src/dmd/statement.d(1670): vpadding: Aligning of field `statement` from 28 to 32 bytes wastes 4 bytes
src/dmd/statement.d(1695): vpadding: Aligning of field `exp` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1723): vpadding: Aligning of field `statement` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1747): vpadding: Aligning of field `ident` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1848): vpadding: Aligning of field `ident` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1913): vpadding: Aligning of field `tokens` from 25 to 32 bytes wastes 7 bytes
src/dmd/statement.d(1975): vpadding: Aligning of field `names` from 68 to 72 bytes wastes 4 bytes
src/dmd/statement.d(2031): vpadding: Aligning of field `imports` from 25 to 32 bytes wastes 7 bytes
src/dmd/target.d(118): vpadding: Aligning of field `maxStaticDataSize` from 7 to 8 bytes wastes 1 byte
src/dmd/target.d(130): vpadding: Aligning of field `architectureName` from 27 to 32 bytes wastes 5 bytes
src/dmd/target.d(136): vpadding: Aligning of field `obj_ext` from 54 to 56 bytes wastes 2 bytes
src/dmd/target.d(169): vpadding: Aligning of field `FloatProperties` from 106 to 112 bytes wastes 6 bytes
src/dmd/objc.d(158): vpadding: Aligning of field `identifier` from 2 to 8 bytes wastes 6 bytes
/home/per/Work/dmd/src/dmd/lexer.d(222): vpadding: Aligning of field `token` from 56 to 64 bytes wastes 8 bytes
/home/per/Work/dmd/src/dmd/lexer.d(234): vpadding: Aligning of field `base` from 164 to 168 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/lexer.d(241): vpadding: Aligning of field `inTokenStringConstant` from 195 to 196 bytes wastes 1 byte
/home/per/Work/dmd/src/dmd/lexer.d(244): vpadding: Aligning of field `tokenFreelist` from 204 to 208 bytes wastes 4 bytes
src/dmd/nogc.d(36): vpadding: Aligning of field `f` from 9 to 16 bytes wastes 7 bytes
src/dmd/dsymbol.d(1309): vpadding: Aligning of field `importedScopes` from 148 to 152 bytes wastes 4 bytes
src/dmd/compiler.d(189): vpadding: Aligning of field `index` from 25 to 32 bytes wastes 7 bytes
src/dmd/denum.d(58): vpadding: Aligning of field `inuse` from 258 to 260 bytes wastes 2 bytes
src/dmd/declaration.d(223): vpadding: Aligning of field `inuse` from 169 to 170 bytes wastes 1 byte
src/dmd/declaration.d(230): vpadding: Aligning of field `mangleOverride` from 173 to 176 bytes wastes 3 bytes
src/dmd/denum.d(262): vpadding: Aligning of field `origValue` from 305 to 312 bytes wastes 7 bytes
src/dmd/mtype.d(257): vpadding: Aligning of field `deco` from 10 to 16 bytes wastes 6 bytes
src/dmd/mtype.d(4149): vpadding: Aligning of field `funcFlags` from 105 to 108 bytes wastes 3 bytes
src/dmd/mtype.d(4153): vpadding: Aligning of field `fargs` from 115 to 120 bytes wastes 5 bytes
src/dmd/mtype.d(6724): vpadding: Aligning of field `id` from 90 to 96 bytes wastes 6 bytes
src/dmd/hdrgen.d(69): vpadding: Aligning of field `inEnumDecl` from 17 to 24 bytes wastes 7 bytes
src/dmd/init.d(108): vpadding: Aligning of field `type` from 25 to 32 bytes wastes 7 bytes
src/dmd/init.d(140): vpadding: Aligning of field `field` from 25 to 32 bytes wastes 7 bytes
src/dmd/init.d(165): vpadding: Aligning of field `index` from 25 to 32 bytes wastes 7 bytes
src/dmd/init.d(168): vpadding: Aligning of field `type` from 100 to 104 bytes wastes 4 bytes
src/dmd/init.d(205): vpadding: Aligning of field `exp` from 26 to 32 bytes wastes 6 bytes
src/dmd/init.d(246): vpadding: Aligning of field `initializerList` from 25 to 32 bytes wastes 7 bytes
src/dmd/dtemplate.d(569): vpadding: Aligning of field `visibility` from 270 to 272 bytes wastes 2 bytes
src/dmd/dtemplate.d(573): vpadding: Aligning of field `previous` from 292 to 296 bytes wastes 4 bytes
src/dmd/dtemplate.d(5374): vpadding: Aligning of field `specType` from 33 to 40 bytes wastes 7 bytes
src/dmd/dtemplate.d(5495): vpadding: Aligning of field `valType` from 33 to 40 bytes wastes 7 bytes
src/dmd/dtemplate.d(5599): vpadding: Aligning of field `specType` from 33 to 40 bytes wastes 7 bytes
src/dmd/dtemplate.d(7639): vpadding: Aligning of field `tqual` from 379 to 384 bytes wastes 5 bytes
/home/per/Work/dmd/src/dmd/root/region.d(39): vpadding: Aligning of field `available` from 4 to 8 bytes wastes 4 bytes
src/dmd/dinterpret.d(724): vpadding: Aligning of field `result` from 20 to 24 bytes wastes 4 bytes
src/dmd/func.d(270): vpadding: Aligning of field `v_arguments` from 337 to 344 bytes wastes 7 bytes
src/dmd/func.d(290): vpadding: Aligning of field `inlineNest` from 419 to 420 bytes wastes 1 byte
src/dmd/func.d(294): vpadding: Aligning of field `fes` from 426 to 432 bytes wastes 6 bytes
src/dmd/func.d(301): vpadding: Aligning of field `tintro` from 449 to 456 bytes wastes 7 bytes
src/dmd/func.d(304): vpadding: Aligning of field `storage_class2` from 465 to 472 bytes wastes 7 bytes
src/dmd/func.d(317): vpadding: Aligning of field `nrvo_var` from 485 to 488 bytes wastes 3 bytes
src/dmd/func.d(328): vpadding: Aligning of field `tookAddressOf` from 521 to 524 bytes wastes 3 bytes
src/dmd/func.d(335): vpadding: Aligning of field `closureVars` from 529 to 536 bytes wastes 7 bytes
src/dmd/func.d(353): vpadding: Aligning of field `objc` from 644 to 648 bytes wastes 4 bytes
src/dmd/func.d(3475): vpadding: Aligning of field `treq` from 674 to 680 bytes wastes 6 bytes
src/dmd/aggregate.d(89): vpadding: Aligning of field `mangleOverride` from 266 to 272 bytes wastes 6 bytes
src/dmd/aggregate.d(767): vpadding: Aligning of field `sinit` from 459 to 464 bytes wastes 5 bytes
src/dmd/dstruct.d(205): vpadding: Aligning of field `postblits` from 479 to 480 bytes wastes 1 byte
src/dmd/dstruct.d(218): vpadding: Aligning of field `argTypes` from 549 to 552 bytes wastes 3 bytes
src/dmd/inlinecost.d(156): vpadding: Aligning of field `fd` from 15 to 16 bytes wastes 1 byte
src/dmd/expression.d(4905): vpadding: Aligning of field `vthis2` from 65 to 72 bytes wastes 7 bytes
src/dmd/expression.d(4948): vpadding: Aligning of field `vthis2` from 75 to 80 bytes wastes 5 bytes
src/dmd/declaration.d(559): vpadding: Aligning of field `tupletype` from 201 to 208 bytes wastes 7 bytes
src/dmd/declaration.d(1705): vpadding: Aligning of field `width` from 305 to 312 bytes wastes 7 bytes
src/dmd/declaration.d(1957): vpadding: Aligning of field `tinfo` from 305 to 312 bytes wastes 7 bytes
src/dmd/cond.d(490): vpadding: Aligning of field `level` from 25 to 28 bytes wastes 3 bytes
src/dmd/cond.d(897): vpadding: Aligning of field `exp` from 25 to 32 bytes wastes 7 bytes
src/dmd/attrib.d(749): vpadding: Aligning of field `sem` from 137 to 140 bytes wastes 3 bytes
src/dmd/attrib.d(1145): vpadding: Aligning of field `cache` from 154 to 160 bytes wastes 6 bytes
src/dmd/apply.d(75): vpadding: Aligning of field `v` from 9 to 16 bytes wastes 7 bytes
src/dmd/dclass.d(180): vpadding: Aligning of field `cppDtorVtblIndex` from 602 to 604 bytes wastes 2 bytes
src/dmd/dclass.d(194): vpadding: Aligning of field `objc` from 611 to 616 bytes wastes 5 bytes
src/dmd/dscope.d(100): vpadding: Aligning of field `intypeof` from 122 to 124 bytes wastes 2 bytes
src/dmd/dscope.d(126): vpadding: Aligning of field `inlining` from 194 to 200 bytes wastes 6 bytes
src/dmd/dscope.d(132): vpadding: Aligning of field `stc` from 228 to 232 bytes wastes 4 bytes
src/dmd/dscope.d(139): vpadding: Aligning of field `userAttribDecl` from 252 to 256 bytes wastes 4 bytes
src/dmd/dmodule.d(468): vpadding: Aligning of field `pkg` from 325 to 328 bytes wastes 3 bytes
src/dmd/dmodule.d(530): vpadding: Aligning of field `importedFrom` from 412 to 416 bytes wastes 4 bytes
src/dmd/dmodule.d(537): vpadding: Aligning of field `debugids` from 468 to 472 bytes wastes 4 bytes
src/dmd/dmodule.d(541): vpadding: Aligning of field `versionids` from 492 to 496 bytes wastes 4 bytes
src/dmd/dmodule.d(1523): vpadding: Aligning of field `cov` from 548 to 552 bytes wastes 4 bytes
src/dmd/dmodule.d(1580): vpadding: Aligning of field `msg` from 41 to 48 bytes wastes 7 bytes
src/dmd/backend/dlist.d(41): vpadding: Aligning of field `__anonymous` from 12 to 16 bytes wastes 4 bytes
src/dmd/backend/type.d(86): vpadding: Aligning of field `Tcount` from 7 to 8 bytes wastes 1 byte
src/dmd/backend/type.d(87): vpadding: Aligning of field `Tident` from 12 to 16 bytes wastes 4 bytes
src/dmd/backend/code.d(175): vpadding: Aligning of field `funcarg` from 4 to 8 bytes wastes 4 bytes
src/dmd/backend/code.d(239): vpadding: Aligning of field `SDoffset` from 4 to 8 bytes wastes 4 bytes
src/dmd/backend/code.d(245): vpadding: Aligning of field `segidx` from 21 to 24 bytes wastes 3 bytes
src/dmd/backend/code.d(251): vpadding: Aligning of field `ledata` from 52 to 56 bytes wastes 4 bytes
src/dmd/backend/code.d(256): vpadding: Aligning of field `SDbuf` from 68 to 72 bytes wastes 4 bytes
src/dmd/backend/code.d(284): vpadding: Aligning of field `linoff` from 12 to 16 bytes wastes 4 bytes
src/dmd/backend/code_x86.d(377): vpadding: Aligning of field `IEV1` from 22 to 24 bytes wastes 2 bytes
src/dmd/backend/code_x86.d(571): vpadding: Aligning of field `save` from 132 to 136 bytes wastes 4 bytes
src/dmd/backend/el.d(85): vpadding: Aligning of field `__anonymous` from 35 to 36 bytes wastes 1 byte
src/dmd/backend/el.d(124): vpadding: Aligning of field `ET` from 50 to 56 bytes wastes 6 bytes
src/dmd/backend/cc.d(309): vpadding: Aligning of field `STinexp` from 11 to 12 bytes wastes 1 byte
src/dmd/backend/cc.d(315): vpadding: Aligning of field `STbfilter` from 18 to 24 bytes wastes 6 bytes
src/dmd/backend/cc.d(345): vpadding: Aligning of field `STclasssym` from 45 to 48 bytes wastes 3 bytes
src/dmd/backend/cc.d(352): vpadding: Aligning of field `STgclass` from 82 to 84 bytes wastes 2 bytes
src/dmd/backend/cc.d(361): vpadding: Aligning of field `STlastfunc` from 124 to 128 bytes wastes 4 bytes
src/dmd/backend/cc.d(443): vpadding: Aligning of field `tryblock` from 44 to 48 bytes wastes 4 bytes
src/dmd/backend/cc.d(559): vpadding: Aligning of field `Bcode` from 84 to 88 bytes wastes 4 bytes
src/dmd/backend/cc.d(578): vpadding: Aligning of field `Binitvar` from 28 to 32 bytes wastes 4 bytes
src/dmd/backend/cc.d(566): vpadding: Aligning of field `__anonymous` from 108 to 112 bytes wastes 4 bytes
src/dmd/backend/cc.d(775): vpadding: Aligning of field `Fparsescope` from 89 to 96 bytes wastes 7 bytes
src/dmd/backend/cc.d(795): vpadding: Aligning of field `__anonymous` from 164 to 168 bytes wastes 4 bytes
src/dmd/backend/cc.d(875): vpadding: Aligning of field `BCpublics` from 26 to 32 bytes wastes 6 bytes
src/dmd/backend/cc.d(881): vpadding: Aligning of field `BCparent` from 60 to 64 bytes wastes 4 bytes
src/dmd/backend/cc.d(904): vpadding: Aligning of field `MPf` from 4 to 8 bytes wastes 4 bytes
src/dmd/backend/cc.d(933): vpadding: Aligning of field `temp_arglist2` from 52 to 56 bytes wastes 4 bytes
src/dmd/backend/cc.d(971): vpadding: Aligning of field `name` from 1 to 8 bytes wastes 7 bytes
src/dmd/backend/cc.d(1003): vpadding: Aligning of field `TMmemberfuncs` from 28 to 32 bytes wastes 4 bytes
src/dmd/backend/cc.d(1009): vpadding: Aligning of field `TMflags` from 65 to 68 bytes wastes 3 bytes
src/dmd/backend/cc.d(1035): vpadding: Aligning of field `SEalias` from 4 to 8 bytes wastes 4 bytes
src/dmd/backend/cc.d(1083): vpadding: Aligning of field `Sflags` from 29 to 32 bytes wastes 3 bytes
src/dmd/backend/cc.d(1087): vpadding: Aligning of field `Snonvirtsize` from 42 to 48 bytes wastes 6 bytes
src/dmd/backend/cc.d(1265): vpadding: Aligning of field `Stype` from 36 to 40 bytes wastes 4 bytes
src/dmd/backend/cc.d(1283): vpadding: Aligning of field `Slabelblk_` from 4 to 8 bytes wastes 4 bytes
src/dmd/backend/cc.d(1310): vpadding: Aligning of field `Smemoff` from 2 to 8 bytes wastes 6 bytes
src/dmd/backend/cc.d(1409): vpadding: Aligning of field `Sflags` from 90 to 92 bytes wastes 2 bytes
src/dmd/backend/cc.d(1434): vpadding: Aligning of field `Sregm` from 2 to 4 bytes wastes 2 bytes
src/dmd/backend/cc.d(1747): vpadding: Aligning of field `EEexpr` from 4 to 8 bytes wastes 4 bytes
src/dmd/backend/cc.d(1753): vpadding: Aligning of field `EEelem` from 28 to 32 bytes wastes 4 bytes
src/dmd/backend/cc.d(1783): vpadding: Aligning of field `ptal` from 23 to 24 bytes wastes 1 byte
src/dmd/backend/cc.d(1785): vpadding: Aligning of field `hasExcSpec` from 33 to 36 bytes wastes 3 bytes
src/dmd/backend/cc.d(1818): vpadding: Aligning of field `__anonymous` from 12 to 16 bytes wastes 4 bytes
src/dmd/libomf.d(499): vpadding: Aligning of field `name` from 14 to 16 bytes wastes 2 bytes
src/dmd/libmscoff.d(619): vpadding: Aligning of field `name` from 18 to 24 bytes wastes 6 bytes
src/dmd/libmscoff.d(621): vpadding: Aligning of field `file_time` from 44 to 48 bytes wastes 4 bytes
src/dmd/libelf.d(509): vpadding: Aligning of field `file_time` from 36 to 40 bytes wastes 4 bytes
src/dmd/dtoh.d(247): vpadding: Aligning of field `adparent` from 1 to 8 bytes wastes 7 bytes
src/dmd/dtoh.d(263): vpadding: Aligning of field `storageClass` from 41 to 48 bytes wastes 7 bytes
src/dmd/dtoh.d(280): vpadding: Aligning of field `context` from 50 to 56 bytes wastes 6 bytes
src/dmd/json.d(54): vpadding: Aligning of field `filename` from 20 to 24 bytes wastes 4 bytes
src/dmd/backend/cgcv.d(61): vpadding: Aligning of field `list` from 4 to 8 bytes wastes 4 bytes
src/dmd/cppmanglewin.d(108): vpadding: Aligning of field `buf` from 172 to 176 bytes wastes 4 bytes
src/dmd/lambdacomp.d(116): vpadding: Aligning of field `d` from 76 to 80 bytes wastes 4 bytes
src/dmd/iasmdmd.d(334): vpadding: Aligning of field `loc` from 1 to 8 bytes wastes 7 bytes
src/dmd/iasmdmd.d(337): vpadding: Aligning of field `psDollar` from 26 to 32 bytes wastes 6 bytes
src/dmd/iasmdmd.d(340): vpadding: Aligning of field `statement` from 49 to 56 bytes wastes 7 bytes
src/dmd/iasmdmd.d(344): vpadding: Aligning of field `lbracketNestCount` from 82 to 84 bytes wastes 2 bytes
src/dmd/iasmdmd.d(644): vpadding: Aligning of field `s` from 44 to 48 bytes wastes 4 bytes
src/dmd/backend/melf.d(314): vpadding: Aligning of field `DBvalu` from 14 to 16 bytes wastes 2 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/runtime.d(129): vpadding: Aligning of field `argv` from 4 to 8 bytes wastes 4 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/runtime.d(827): vpadding: Aligning of field `callstack` from 28 to 32 bytes wastes 4 bytes
src/dmd/blockexit.d(71): vpadding: Aligning of field `result` from 17 to 20 bytes wastes 3 bytes
src/dmd/canthrow.d(43): vpadding: Aligning of field `func` from 9 to 16 bytes wastes 7 bytes
src/dmd/canthrow.d(40): vpadding: Aligning of field `this` from 25 to 32 bytes wastes 7 bytes
src/dmd/dcast.d(238): vpadding: Aligning of field `this` from 20 to 24 bytes wastes 4 bytes
src/dmd/delegatize.d(89): vpadding: Aligning of field `fd` from 9 to 16 bytes wastes 7 bytes
src/dmd/delegatize.d(204): vpadding: Aligning of field `sc` from 9 to 16 bytes wastes 7 bytes
src/dmd/delegatize.d(200): vpadding: Aligning of field `this` from 25 to 32 bytes wastes 7 bytes
src/dmd/dinterpret.d(4247): vpadding: Aligning of field `this` from 19 to 24 bytes wastes 5 bytes
src/dmd/parse.d(209): vpadding: Aligning of field `visibility` from 17 to 24 bytes wastes 7 bytes
src/dmd/parse.d(211): vpadding: Aligning of field `ealign` from 41 to 48 bytes wastes 7 bytes
src/dmd/parse.d(224): vpadding: Aligning of field `idents` from 2 to 8 bytes wastes 6 bytes
src/dmd/parse.d(302): vpadding: Aligning of field `linkLoc` from 233 to 240 bytes wastes 7 bytes
src/dmd/parse.d(304): vpadding: Aligning of field `endloc` from 257 to 264 bytes wastes 7 bytes
src/dmd/parse.d(306): vpadding: Aligning of field `lookingForElse` from 284 to 288 bytes wastes 4 bytes
src/dmd/cparse.d(4146): vpadding: Aligning of field `scw` from 1 to 4 bytes wastes 3 bytes
src/dmd/cparse.d(4148): vpadding: Aligning of field `alignExps` from 12 to 16 bytes wastes 4 bytes
src/dmd/dtemplate.d(3501): vpadding: Aligning of field `result` from 57 to 60 bytes wastes 3 bytes
src/dmd/dtemplate.d(5021): vpadding: Aligning of field `this` from 25 to 32 bytes wastes 7 bytes
src/dmd/escape.d(1508): vpadding: Aligning of field `this` from 17 to 24 bytes wastes 7 bytes
src/dmd/escape.d(1859): vpadding: Aligning of field `this` from 17 to 24 bytes wastes 7 bytes
src/dmd/expression.d(6546): vpadding: Aligning of field `sc` from 9 to 16 bytes wastes 7 bytes
src/dmd/expression.d(6542): vpadding: Aligning of field `this` from 41 to 48 bytes wastes 7 bytes
src/dmd/inline.d(2305): vpadding: Aligning of field `exp` from 9 to 16 bytes wastes 7 bytes
src/dmd/inlinecost.d(339): vpadding: Aligning of field `icv` from 9 to 16 bytes wastes 7 bytes
src/dmd/optimize.d(268): vpadding: Aligning of field `this` from 21 to 24 bytes wastes 3 bytes
src/dmd/sideeffect.d(36): vpadding: Aligning of field `this` from 9 to 16 bytes wastes 7 bytes
src/dmd/sideeffect.d(74): vpadding: Aligning of field `this` from 9 to 16 bytes wastes 7 bytes
src/dmd/statement.d(213): vpadding: Aligning of field `this` from 9 to 16 bytes wastes 7 bytes
src/dmd/statement.d(252): vpadding: Aligning of field `this` from 9 to 16 bytes wastes 7 bytes
src/dmd/statement.d(291): vpadding: Aligning of field `this` from 9 to 16 bytes wastes 7 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/cpuid.d(112): vpadding: Aligning of field `lineSize` from 9 to 12 bytes wastes 3 bytes
/home/per/.local/dlang/linux/bin64/src/druntime/import/core/cpuid.d(325): vpadding: Aligning of field `processorName` from 2 to 8 bytes wastes 6 bytes
src/dmd/traits.d(194): vpadding: Aligning of field `this` from 33 to 40 bytes wastes 7 bytes
src/dmd/foreachvar.d(57): vpadding: Aligning of field `dgVar` from 9 to 16 bytes wastes 7 bytes
src/dmd/iasmdmd.d(2433): vpadding: Aligning of field `this` from 12 to 16 bytes wastes 4 bytes
src/dmd/iasmdmd.d(2447): vpadding: Aligning of field `this` from 12 to 16 bytes wastes 4 bytes
/home/per/Work/dmd/src/dmd/root/array.d(898): vpadding: Aligning of field `this` from 17 to 24 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/root/array.d(898): vpadding: Aligning of field `this` from 17 to 24 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/root/array.d(898): vpadding: Aligning of field `this` from 17 to 24 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/root/array.d(898): vpadding: Aligning of field `this` from 17 to 24 bytes wastes 7 bytes
/home/per/Work/dmd/src/dmd/root/array.d(898): vpadding: Aligning of field `this` from 17 to 24 bytes wastes 7 bytes
src/dmd/toobj.d(283): vpadding: Aligning of field `this` from 9 to 16 bytes wastes 7 bytes
Gonna update the diagnostics to print the field aggregate type aswell.
FYI, @UplinkCoder @maxhaton
It would be useful to have a diagnostics that describes how the total aggregate size would change with a potential a minimal reordering that lowers that total size. Such a diagnostics would not complain about cases such as
struct S
{
int x;
long y;
}
as putting y before x that doesn't affect S.sizeof.
I'm just going to quote @WalterBright on this: #13106 (comment)
Yes, I still hold that opinion.
As for padding, it's pretty obvious where it is. But there are other considerations for field layout:
- grouping to minimize memory cache misses
- logical grouping to make the code easier to read
Probably the single largest thing we could do to reduce dmd's memory object consumption is to copy the bit field support from ImportC into D, then replace all those bool flags with 1 bit fields.
1. grouping to minimize memory cache misses
Are there tools that help out detecting how these groupings should be performed?
Probably the single largest thing we could do to reduce dmd's memory object consumption is to copy the bit field support from ImportC into D, then replace all those bool flags with 1 bit fields.
Yes, please.
See my above comment about pahole.
For cache misses specifically, you can optimize to get more bounce to the ounce (i.e. you can fit more ints than longs in one cache line) but grouping things without compressing their layout requires looking at how they are accessed even with this data it is not an easy problem to solve in the general case and thus has to be done by a human.
On Mon, 4 Oct 2021, 23:37 Per Nordlöw, @.***> wrote:
- grouping to minimize memory cache misses
Are there tools that help out detecting how these groupings should be performed?
Probably the single largest thing we could do to reduce dmd's memory object consumption is to copy the bit field support from ImportC into D, then replace all those bool flags with 1 bit fields.
Yes, please.
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/dlang/dmd/pull/13117#issuecomment-933907930, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABLI75GJWKPPYFBBRCW4XIDUFIUA7ANCNFSM5FDMXQBQ . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.