aaron.ballman added reviewers: rjmccall, efriedma.
aaron.ballman added subscribers: efriedma, rjmccall.
aaron.ballman added a comment.

In D150221#4338500 <https://reviews.llvm.org/D150221#4338500>, @qianzhen wrote:

> This is useful in keeping the static variables in a patchable function 
> (https://clang.llvm.org/docs/AttributeReference.html#patchable-function-entry),
>  so that they can be directly addressed by a hot patch when the optimization 
> to merge them is enabled 
> (https://llvm.org/docs/doxygen/GlobalMerge_8cpp_source.html).

I would expect that the user could write `__attribute__((used))` themselves in 
that case rather than use the heavy hammer of keeping all statics in the TU, 
right?

In D150221#4332280 <https://reviews.llvm.org/D150221#4332280>, 
@hubert.reinterpretcast wrote:

> In D150221#4332142 <https://reviews.llvm.org/D150221#4332142>, @erichkeane 
> wrote:
>
>>> This is intended to prevent "excessive transformation" to enable migration 
>>> of existing applications (using a non-Clang compiler) where users further 
>>> manipulate the object or assembly after compilation.
>>
>> I don't get what you mean by this?  I don't currently see motivation for 
>> this?
>
> The intent is to apply the `__attribute__((__used__))` semantic to static 
> variables (since the front-end is likely to discard them). Additional reasons 
> for using `__attribute__((__used__))` applies: The compiler cannot optimize 
> with the assumption that it sees all direct accesses to the variable.

The part I'm having a hard time understanding is why this should be a TU-level 
option when the user can write `__attribute__((used))` on any static that 
matters to them that is being dropped? This feels like a heavy hammer.

Adding @rjmccall and @efriedma as codegen code owners.



================
Comment at: clang/lib/CodeGen/CodeGenModule.cpp:2201-2210
+  if ((CodeGenOpts.KeepStaticConsts || CodeGenOpts.KeepStaticVariables) && D &&
+      isa<VarDecl>(D)) {
     const auto *VD = cast<VarDecl>(D);
-    if (VD->getType().isConstQualified() &&
-        VD->getStorageDuration() == SD_Static)
-      addUsedOrCompilerUsedGlobal(GV);
+    if (VD->getStorageDuration() == SD_Static) {
+      if (CodeGenOpts.KeepStaticVariables)
+        addUsedOrCompilerUsedGlobal(GV);
+      else if (CodeGenOpts.KeepStaticConsts && 
VD->getType().isConstQualified())
----------------
Reformatted with whatever clang-format does for that, as I doubt I have the 
formatting correct.


================
Comment at: clang/lib/CodeGen/CodeGenModule.cpp:3096
+        return true;
+      else if (CodeGenOpts.KeepStaticConsts && 
VD->getType().isConstQualified())
+        return true;
----------------
cebowleratibm wrote:
> Fold to a single return.
Yup, similar suggestion here as above.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150221/new/

https://reviews.llvm.org/D150221

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to