[clang] [clang][CodeGen] Zero init unspecified fields in initializers in C (PR #97121)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 2 19:23:14 PDT 2024
================
@@ -361,6 +368,13 @@ CodeGenFunction::AddInitializerToStaticVarDecl(const VarDecl &D,
}
return GV;
}
+ if (!getLangOpts().CPlusPlus) {
+ // In C, when an initializer is given, the Linux kernel relies on clang to
+ // zero-initialize all members not explicitly initialized, including padding
+ // bits.
----------------
yabinc wrote:
> I suggest quoting the standard, identifying the ambiguity, and then saying that we've chosen to interpret it as requiring all padding in the object to be zeroed. Since there are multiple paths in the compiler that need this logic, you may want to write this in a single place and then cross-reference it from other places.
Done.
> I don't mind staging it in over multiple commits in principle. If you'd like to switch to an implementation that adds explicit padding fields when building the original constant, you could still stage that and only add those fields in certain language modes.
I am OOO next week, will try it in ConstantEmitter after that.
> We probably do need to consider it when deciding whether to memset, but naively I'd expect that you'd just emit little memsets for each individual piece of padding when we recognize that there's a gap between successive fields. Does that not work?
It works. Done.
https://github.com/llvm/llvm-project/pull/97121
More information about the cfe-commits
mailing list