r281395 - Try harder to not inline dllimport functions referencing non-dllimport functions

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 13 16:00:39 PDT 2016


r281413 for the constructors.

On Tue, Sep 13, 2016 at 2:58 PM, Hans Wennborg <hans at chromium.org> wrote:
> Good point. Constructors are also a problem, I'll try to fix.
>
> It's not exactly the same issue, because they do show up in the AST,
> but they're referenced with a CXXConstructExpr, and not the
> DeclRefExpr which DLLImportFunctionVisitor is looking for.
>
> There doesn't seem to be any problem with operator= though.
>
> On Tue, Sep 13, 2016 at 2:36 PM, Nico Weber via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>> 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
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>


More information about the cfe-commits mailing list