Author: hans Date: Thu Jan 19 15:33:13 2017 New Revision: 292522 URL: http://llvm.org/viewvc/llvm-project?rev=292522&view=rev Log: Don't inline dllimport functions referencing non-imported methods
This is another follow-up to r246338. I had assumed methods were already handled by the AST visitor, but turns out they weren't. Modified: cfe/trunk/lib/CodeGen/CodeGenModule.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=292522&r1=292521&r2=292522&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Thu Jan 19 15:33:13 2017 @@ -1751,6 +1751,11 @@ namespace { SafeToInline = E->getConstructor()->hasAttr<DLLImportAttr>(); return SafeToInline; } + bool VisitCXXMemberCallExpr(CXXMemberCallExpr *E) { + CXXMethodDecl *M = E->getMethodDecl(); + SafeToInline = M->hasAttr<DLLImportAttr>(); + return SafeToInline; + } bool VisitCXXDeleteExpr(CXXDeleteExpr *E) { SafeToInline = E->getOperatorDelete()->hasAttr<DLLImportAttr>(); return SafeToInline; Modified: cfe/trunk/test/CodeGenCXX/dllimport.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllimport.cpp?rev=292522&r1=292521&r2=292522&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/dllimport.cpp (original) +++ cfe/trunk/test/CodeGenCXX/dllimport.cpp Thu Jan 19 15:33:13 2017 @@ -26,6 +26,7 @@ struct ExplicitSpec_NotImported {}; #define USEVARTYPE(type, var) type UNIQ(use)() { return var; } #define USEVAR(var) USEVARTYPE(int, var) #define USE(func) void UNIQ(use)() { func(); } +#define USE1(func) void UNIQ(use)() { func(nullptr); } #define USEMEMFUNC(class, func) void (class::*UNIQ(use)())() { return &class::func; } #define USESTATICMEMFUNC(class, func) void (*UNIQ(use)())() { return &class::func; } #define USECLASS(class) void UNIQ(USE)() { class x; } @@ -316,10 +317,13 @@ namespace ns { __declspec(dllimport) voi USE(ns::externalFunc) // A dllimport function referencing non-imported vars or functions must not be available_externally. + __declspec(dllimport) int ImportedVar; int NonImportedVar; __declspec(dllimport) int ImportedFunc(); int NonImportedFunc(); +struct ClassWithNonImportedMethod { int f(); }; + __declspec(dllimport) inline int ReferencingImportedVar() { return ImportedVar; } // MO1-DAG: define available_externally dllimport i32 @"\01?ReferencingImportedVar@@YAHXZ" __declspec(dllimport) inline int ReferencingNonImportedVar() { return NonImportedVar; } @@ -328,10 +332,13 @@ __declspec(dllimport) inline int Referen // MO1-DAG: define available_externally dllimport i32 @"\01?ReferencingImportedFunc@@YAHXZ" __declspec(dllimport) inline int ReferencingNonImportedFunc() { return NonImportedFunc(); } // MO1-DAG: declare dllimport i32 @"\01?ReferencingNonImportedFunc@@YAHXZ"() +__declspec(dllimport) inline int ReferencingNonImportedMethod(ClassWithNonImportedMethod *x) { return x->f(); } +// MO1-DAG: declare dllimport i32 @"\01?ReferencingNonImportedMethod USE(ReferencingImportedVar) USE(ReferencingNonImportedVar) USE(ReferencingImportedFunc) USE(ReferencingNonImportedFunc) +USE1(ReferencingNonImportedMethod) // References to operator new and delete count too, despite not being DeclRefExprs. __declspec(dllimport) inline int *ReferencingNonImportedNew() { return new int[2]; } // MO1-DAG: declare dllimport i32* @"\01?ReferencingNonImportedNew@@YAPAHXZ" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits