[PATCH] Defer codegen of dllexport/attribute(used) inline method definitions
Hans Wennborg
hans at chromium.org
Thu Jun 5 18:48:54 PDT 2014
================
Comment at: lib/CodeGen/ModuleBuilder.cpp:92
@@ -91,3 @@
- if (!D->isDependentContext() &&
- (D->hasAttr<UsedAttr>() || D->hasAttr<ConstructorAttr>() ||
- D->hasAttr<DLLExportAttr>())) {
----------------
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.
================
Comment at: test/CodeGenCXX/attr-used.cpp:21
@@ +20,3 @@
+ // We must delay emission of bar() until foo() has had its body parsed,
+ // othersie foo() would not be emitted.
+ void __attribute__((used)) bar() { foo(); }
----------------
Richard Smith wrote:
> Reid Kleckner wrote:
> > "otherwise"
> Typo "othersie"
Done.
http://reviews.llvm.org/D4038
More information about the cfe-commits
mailing list