r281395 - Try harder to not inline dllimport functions referencing non-dllimport functions
Nico Weber via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 13 14:36:12 PDT 2016
Could other implicit functions (operator=, ctors) have similar issues?
On Tue, Sep 13, 2016 at 5:08 PM, Hans Wennborg via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: hans
> Date: Tue Sep 13 16:08:20 2016
> New Revision: 281395
>
> URL: http://llvm.org/viewvc/llvm-project?rev=281395&view=rev
> Log:
> Try harder to not inline dllimport functions referencing non-dllimport
> functions
>
> In r246338, code was added to check for this, but it failed to take into
> account implicit destructor invocations because those are not reflected
> in the AST. This adds a separate check for them.
>
> Modified:
> cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> cfe/trunk/test/CodeGenCXX/dllimport-members.cpp
> cfe/trunk/test/CodeGenCXX/dllimport.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> CodeGenModule.cpp?rev=281395&r1=281394&r2=281395&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Tue Sep 13 16:08:20 2016
> @@ -1740,8 +1740,17 @@ CodeGenModule::isTriviallyRecursive(cons
> return Walker.Result;
> }
>
> -bool
> -CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
> +// Check if T is a class type with a destructor that's not dllimport.
> +static bool HasNonDllImportDtor(QualType T) {
> + if (const RecordType *RT = dyn_cast<RecordType>(T))
> + if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
> + if (RD->getDestructor() && !RD->getDestructor()->hasAttr<
> DLLImportAttr>())
> + return true;
> +
> + return false;
> +}
> +
> +bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
> if (getFunctionLinkage(GD) != llvm::Function::
> AvailableExternallyLinkage)
> return true;
> const auto *F = cast<FunctionDecl>(GD.getDecl());
> @@ -1754,6 +1763,18 @@ CodeGenModule::shouldEmitFunction(Global
> Visitor.TraverseFunctionDecl(const_cast<FunctionDecl*>(F));
> if (!Visitor.SafeToInline)
> return false;
> +
> + if (const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(F)) {
> + // Implicit destructor invocations aren't captured in the AST, so
> the
> + // check above can't see them. Check for them manually here.
> + for (const Decl *Member : Dtor->getParent()->decls())
> + if (isa<FieldDecl>(Member))
> + if (HasNonDllImportDtor(cast<FieldDecl>(Member)->getType()))
> + return false;
> + for (const CXXBaseSpecifier &B : Dtor->getParent()->bases())
> + if (HasNonDllImportDtor(B.getType()))
> + return false;
> + }
> }
>
> // PR9614. Avoid cases where the source code is lying to us. An
> available
>
> Modified: cfe/trunk/test/CodeGenCXX/dllimport-members.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> CodeGenCXX/dllimport-members.cpp?rev=281395&r1=281394&r2=281395&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/CodeGenCXX/dllimport-members.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/dllimport-members.cpp Tue Sep 13 16:08:20
> 2016
> @@ -44,7 +44,7 @@ void useSpecials() {
> }
>
> // Used to force non-trivial special members.
> -struct ForceNonTrivial {
> +struct __declspec(dllimport) ForceNonTrivial {
> ForceNonTrivial();
> ~ForceNonTrivial();
> ForceNonTrivial(const ForceNonTrivial&);
>
> Modified: cfe/trunk/test/CodeGenCXX/dllimport.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> CodeGenCXX/dllimport.cpp?rev=281395&r1=281394&r2=281395&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/CodeGenCXX/dllimport.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/dllimport.cpp Tue Sep 13 16:08:20 2016
> @@ -347,6 +347,13 @@ __declspec(dllimport) inline int *Refere
> // MO1-DAG: define available_externally dllimport i32* @"\01?
> ReferencingImportedDelete@@YAPAHXZ"
> USE(ReferencingImportedNew)
> USE(ReferencingImportedDelete)
> +struct ClassWithDtor { ~ClassWithDtor() {} };
> +struct __declspec(dllimport) ClassWithNonDllImportField { ClassWithDtor
> t; };
> +struct __declspec(dllimport) ClassWithNonDllImportBase : public
> ClassWithDtor { };
> +USECLASS(ClassWithNonDllImportField);
> +USECLASS(ClassWithNonDllImportBase);
> +// MO1-DAG: declare dllimport x86_thiscallcc void @"\01??
> 1ClassWithNonDllImportBase@@QAE at XZ"(%struct.ClassWithNonDllImportBase*)
> +// MO1-DAG: declare dllimport x86_thiscallcc void @"\01??
> 1ClassWithNonDllImportField@@QAE at XZ"(%struct.ClassWithNonDllImportField*)
>
> // A dllimport function with a TLS variable must not be
> available_externally.
> __declspec(dllimport) inline void FunctionWithTLSVar() { static __thread
> int x = 42; }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160913/26cec910/attachment-0001.html>
More information about the cfe-commits
mailing list