yabinc wrote:



> It probably makes sense to add a helper like the following to CodeGenModule 
> or something like that:
> 
> ```
> bool shouldZeroInitPadding() { 
>   // Comment explaining reasoning for this rule
>   return !CGM.getLangOpts().CPlusPlus;
> }
> ```
> 
> So we don't have `// See comment in getPadding().` all over the place.

Done.

> 
> Is there any relevant code using EmitNullConstant()? As far as I can tell, 
> this patch doesn't zero-fill implicit padding in null constants (like in 
> `struct { int x; long y; }`.

I ran all tests in clang/tests and found two places using it:
1. One is used in CodeGenFunction::EmitNullInitialization(Address DestPtr, 
QualType Ty), when !CGM.getTypes().isZeroInitializable(Ty). This seems to only 
happen in C++ code (when a class contains a pointer pointing
  to data member).
2. Another is used in CodeGenModule::getOrCreateStaticVarDecl(), which is 
further called in three places:
  a. CodeGenFunction::AddInitializerToStaticVarDecl(): it later calls 
ConstantEmitter::tryEmitForInitializer() if an initializer is used.
  b. CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) in CGExpr.cpp 
  c. ConstantLValueEmitter::tryEmitBase(const APValue::LValueBase &base) in 
CGExprConstant.cpp
  Not sure what b and c are doing.
When running tests for non c++ code, I only found the 2.a path, used in 
CodeGenOpenCL/amdgpu-nullptr.cl.
So I didn't find any C code using EmitNullConstant(), that results in 
uninitialized fields with initializers.

For the implementation of EmitNullConstant(), it returns 
ConstantStruct::get(llvm::ConstantStruct::get(structure, elements). In 
ConstantStruct::get(), if all elements are zero, then it returns 
ConstantAggregateZero::get(ST).
>From  https://llvm.org/docs/LangRef.html:
`The string ‘zeroinitializer’ can be used to zero initialize a value to zero of 
any type, including scalar and 
[aggregate](https://llvm.org/docs/LangRef.html#t-aggregate) types. This is 
often used to avoid having to print large zero initializers (e.g. for large 
arrays) and is always exactly equivalent to using explicit zero initializers.`

>From the above words, I feel using `%struct.S2 zeroinitializer` may not 
>guarantee the padding in the struct are zero initialized. But if it is used 
>for a static variable created by CodeGenModule::getOrCreateStaticVarDecl(), 
>it's
as good as a static/global variable without initializer.





https://github.com/llvm/llvm-project/pull/97121
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to