[cfe-dev] [RFC] Suppress C++ static destructor registration

Erik Pilkington via cfe-dev cfe-dev at lists.llvm.org
Mon Aug 20 13:33:04 PDT 2018


I've put a patch up for this here: https://reviews.llvm.org/D50994

Thanks!


On 7/16/18 2:55 PM, JF Bastien via cfe-dev wrote:
> Hi folks,
>
> I’d like to add a flag in clang, -fno-cxx-static-destructors,  which 
> allows developers to demand that no static destructors be emitted. 
> Bruno has a sample implementation <https://reviews.llvm.org/D22474>. 
> We’ve discussed this previously 
> <http://lists.llvm.org/pipermail/cfe-dev/2016-July/050040.html> but 
> I’d like to re-open the discussion and make a different case for it 
> because we’ve received more requests for such a feature.
>
>
> *Why is this desirable?*
>
> In low-memory circumstances it’s often the case that we know that 
> static global destructors are never called. It would be useful to 
> avoid emitting them entirely to save memory. We can’t necessarily make 
> the types themselves trivially destructible (e.g. a std::map, or a 
> type that’s used both as a global and as an automatic variable for 
> which the destructor is only meaningful when automatic, or coming from 
> 3rd party library such as boost), and using a NeverDestroyed<T> class 
> or global pointer only (std::string& foo = *new std::string(“derp");) 
> prevents constexpr and is annoying boilerplate (and again, 3rd party 
> code breaks that party).
>
> This is also useful for some thread-related use cases: we have 
> empirical evidence that threads using globals cause crashes if these 
> globals are being destroyed.
>
> Thread-local storage is similarly painful for different reasons. I’m 
> not proposing that anything be done yet, but let’s keep it in mind.
>
>
> *Developers want this?*
>
> Yes, we’ve received numerous requests for this. Developers are worried 
> about code footprint, and have numerous crash reports they’d like to 
> get rid of. Developers tell us they’d really rather not pay for this 
> feature, because they don’t want to use it yet are stuck with it (and 
> C++ is a “don’t pay for what you don’t use” language).
> Interesting note: developers are used to having no cleanup on 
> termination on platforms where applications can get terminated when 
> e.g. they’re sent to the background by user action.
>
>
> *Concrete example*
>
> Greg Parker provided this example of thread-related issues in the 
> previous discussion:
>
>     The Objective-C runtime has a global table that stores retain
>     counts. Pretty much all Objective-C code in the process uses this
>     table. With global destructors in place this table is destroyed
>     during exit(). If any other thread is still running Objective-C
>     code then it will crash.
>
>     Currently the Objective-C runtime avoids the destructor by
>     initializing this table using placement new into an aligned static
>     char buffer.
>
>
> I’m assuming that the embedded usecase is obvious enough to everyone 
> to not need an example. Let me know if that’s not the case.
>
>
> *What about standardization?*
>
> If this works out I'll discuss standardization options through SG14 
> (and then WG21). The type of developer who’s asked for this are 
> typical SG14 targets (embedding, gaming, etc). This might fit in with 
> “freestanding” or other similar SG14 efforts, but we need experience 
> to guide the proposal. Maybe EWG will be interested as well? 🤷‍♂️
>
>
> Thanks,
>
> JF
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180820/5f37c98b/attachment.html>


More information about the cfe-dev mailing list