[cfe-dev] Should dump methods be LLVM_ATTRIBUTE_USED only in debug builds?
Alp Toker
alp at nuanti.com
Fri Jan 3 17:09:15 PST 2014
On 04/01/2014 01:03, Nico Weber wrote:
> Now that I played with this a bit, I realized that triggering this on
> NDEBUG means it's only stripped in -Asserts builds, independent of
> Debug and Release.
>
> How about something completely different: Let NO_DEAD_STRIP be 1 by
> default in debug builds, and remove used attribute completely? Then
> the dump functions won't be stripped in debug (since no stripping is
> done), and no special attribute is needed. (And the dump() functions
> get stripped in Release+Asserts mode too as long as nothing calls them.)
That's a smart solution, but the patch I send gets the job done more
consistently by ensuring the symbols are always there in builds where we
need them.
Is there anything controversial about the patch I posted at this point?
It's already got my thumbs up...
Alp.
>
> On Fri, Jan 3, 2014 at 2:59 PM, Nico Weber <thakis at chromium.org
> <mailto:thakis at chromium.org>> wrote:
>
> On Fri, Jan 3, 2014 at 2:11 PM, Chandler Carruth
> <chandlerc at google.com <mailto:chandlerc at google.com>> wrote:
>
> On Fri, Jan 3, 2014 at 4:08 PM, Alp Toker <alp at nuanti.com
> <mailto:alp at nuanti.com>> wrote:
>
>
> On 03/01/2014 19:41, Chandler Carruth wrote:
>
> On Fri, Jan 3, 2014 at 2:03 PM, Nico Weber
> <thakis at chromium.org <mailto:thakis at chromium.org>
> <mailto:thakis at chromium.org
> <mailto:thakis at chromium.org>>> wrote:
>
> On Fri, Jan 3, 2014 at 10:15 AM, Nico Weber
> <thakis at chromium.org <mailto:thakis at chromium.org>
> <mailto:thakis at chromium.org
> <mailto:thakis at chromium.org>>> wrote:
>
> Ok, sounds like it's not clear if folks want
> to have dump
> methods behind #ifdef !NDEBUG. Maybe we don't
> have to resolve
> that part in this thread
>
> Is there any opposition to replacing the
> attributes on just
> the dump methods with LLVM_DUMP_METHOD? That's
> a subset of
> Chandler's change and I think also what Alp's
> diff is.
>
> …which is effectively Alp's patch I suppose. So
> maybe we could
> land that for now and then discuss whether to put
> dump() methods
> in !NDEBUG at some other point?
>
>
> I'd like to actually see the patch rather than talk in
> the hypothetical.
>
>
> The patch was in the original mail you replied to.
>
>
> Sorry, totally missed the attachments when ctatching up on
> this thread. Thanks.
>
>
>
> Maybe I misunderstood, but I thought it also moved the
> attribute to the definition? I don't understand why
> that's relevant yet (which is why maybe I've
> misunderstood what was happening).
>
>
> Explained in the original mail.
>
>
> The first time I read it I got the impression there was some
> other bug besides the general desire to avoid NDEBUG in
> headers. Re-reading it, it seems that was all? Have I
> understood it correctly this time?
>
>
> My reading of the spec for the attribute seems to
> indicate that there is no difference....
>
>
> If there's no spec difference between the declaration and
> definition forms, that's a good reason to avoid the form
> that's problematic and go with the simple patch in the
> original mail.
>
>
> Again, I got the impression there was something more than
> moving NDEBUG references out of headers, but it seems that
> impression was wrong.
>
>
> Anyways, I don't actually agree with the conclusion of the
> NDEBUG-in-headers discussion, but we can continue that
> discussion on its original thread. I've posted the primary
> reason why I don't see how to do this across the entire LLVM
> project in the thread.
>
> My real motivation here is simple:
> - I really like the helper functions used exclusively to
> support "dump" or "assert" (things we don't expect to
> generally ship in the released compiler) to be clearly
> separated from other functions. Even better if I get a
> compiler error when I misuse one from normal code.
> - I don't see any good way to do this if the only marking of
> dump methods are conditional "used" attributes. We don't want
> to similarly mark the helper functions (no need to call them
> from the debugger) and even if we did it wouldn't get us
> warnings when we mix them up.
> - If we put guards around the very declaration of these
> methods, then we'll get errors when we call helpers from
> non-assert contexts, and we'll get warnings when we fail to
> appropriately guard a method that is only used from assert
> contexts.
> - But that runs afoul of the desire to have NDEBUG-free
> headers. I disagree with that general direction, but lets
> discuss that on its thread. (Note, I don't think your current
> patches meaningfully harm the NDEBUG issue -- they are
> strictly ABI neutral.)
>
> Regarding your existing patch as an incremental step, I have
> some comments:
>
> - I suspect these should be controlled by !NDEBUG ||
> LLVM_ENABLE_DUMP
>
>
> The macro is controlled by this already.
>
> - I don't know that "DEBUG" is the right word here, because of
> the ability to control them with the LLVM_ENABLE_DUMP build
> configuration option
>
>
> Went with your name suggestion.
>
> - You don't remove NDEBUG || LLVM_ENABLE_DUMP complexity from
> any of the dump methods in LLVM... or apply this attribute to
> any of the existing dump methods that are missing it
> currently. I'm not sure we should, because I like the
> compile-away removal mechanism more than the link-away as
> outlined above. =/
>
>
> This can be done consistently one way or another after the
> discussion on the other thread is done.
>
> - Why is noinline kept in the !NDEBUG case? Is that just for
> ABI neutrality?
>
>
> Kept it for now.
>
> - Won't this cause warnings for unused private methods in
> !NDEBUG builds when the dump methods are not marked used? If
> we leave the methods in place, it would seem natural to mark
> them as unused in the !NDEBUG case to avoid this.
>
>
> All dump methods in llvm and clang with these attributes happen to
> be public at the moment.
>
> Since we all seem to be in violent agreement about the basic
> approach, I went ahead and checked in the llvm bits in r198456.
> I'll do the s/LLVM_ATTRIBUTE_USED/LLVM_DUMP_METHOD/ bit in clang
> later today, and we can decide if we want to move the attributes
> from declaration to definition in a follow-up.
>
> Nico
>
--
http://www.nuanti.com
the browser experts
More information about the cfe-dev
mailing list