[PATCH] Defer codegen of dllexport/attribute(used) inline method definitions
Richard Smith
richard at metafoo.co.uk
Fri Jun 6 09:56:16 PDT 2014
On Fri, Jun 6, 2014 at 9:53 AM, Richard Smith <richard at metafoo.co.uk> wrote:
> On Thu, Jun 5, 2014 at 10:11 PM, Hans Wennborg <hans at chromium.org> wrote:
>
>> ================
>> Comment at: lib/CodeGen/ModuleBuilder.cpp:92
>> @@ -91,3 @@
>> - if (!D->isDependentContext() &&
>> - (D->hasAttr<UsedAttr>() || D->hasAttr<ConstructorAttr>() ||
>> - D->hasAttr<DLLExportAttr>())) {
>> ----------------
>> Richard Smith wrote:
>> > Hans Wennborg wrote:
>> > > Richard Smith wrote:
>> > > > An alternative fix would be to check `D->isUsed()` instead of
>> checking for `UsedAttr` here. That'd avoid the locality degradation and
>> memory allocation here.
>> > > >
>> > > > Or just remove this check and unconditionally call
>> `EmitTopLevelDecl`? That would better match what we do for out-of-line
>> method definitions, and would avoid duplicating this between here and
>> `ASTContext::DeclMustBeEmitted`.
>> > > Checking D->isUsed() certainly sounds simpler :-) I'll try that out.
>> > >
>> > > We can't unconditionally call EmitTopLevelDecl, because it will call
>> DeclMustBeEmitted, which might calculate the gva linkage, and then we fail
>> this test from SemaCXX/undefined-internal.cpp :(
>> > >
>> > > namespace test7 {
>> > > typedef struct {
>> > > void bar();
>> > > void foo() { bar(); }
>> > > } A;
>> > > }
>> > >
>> > > I suspect that test doesn't work well with the "used" attribute
>> either.
>> > Arrgh! That's horrible, but it does justify delaying the emission to
>> end of TU. The existing code is wrong for this case even without checking
>> 'used'. A comment here mentioning this case would be useful for future
>> archaeologists.
>> The current patch delays emission to the end of the current top level
>> declaration. Is that OK, or are you saying we need to delay all the way to
>> the end of the TU?
>>
>
> End-of-top-level-decl sounds strictly better than end-of-TU =)
>
... except that the end-of-top-level-decl callback presumably doesn't
happen late enough (if it did, the recursive-class-walk we used to do would
have worked too). And in particular, here:
struct S {
struct T {
void foo() {}
void bar() { foo(); }
};
};
... I think we'll have no top-level decl emitted after the method bodies
are passed to the consumer.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140606/89716ce3/attachment.html>
More information about the cfe-commits
mailing list