diff options
Diffstat (limited to 'lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 5ef57ffdcc..c771461704 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -482,18 +482,23 @@ bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) { if (FD->hasAttr<ConstructorAttr>() || FD->hasAttr<DestructorAttr>()) return false; - // FIXME: What about inline, and/or extern inline? - if (FD->getStorageClass() != FunctionDecl::Static) - return false; - } else { - const VarDecl *VD = cast<VarDecl>(Global); - assert(VD->isFileVarDecl() && "Invalid decl"); - - if (VD->getStorageClass() != VarDecl::Static) - return false; + GVALinkage Linkage = GetLinkageForFunctionOrMethodDecl(FD); + + // static, static inline, always_inline, and extern inline functions can + // always be deferred. + if (Linkage == GVA_Internal || Linkage == GVA_ExternInline) + return true; + + // inline functions can be deferred unless we're in C89 mode. + if (Linkage == GVA_Inline && (Features.C99 || Features.CPlusPlus)) + return true; + + return false; } - - return true; + + const VarDecl *VD = cast<VarDecl>(Global); + assert(VD->isFileVarDecl() && "Invalid decl"); + return VD->getStorageClass() == VarDecl::Static; } void CodeGenModule::EmitGlobal(const ValueDecl *Global) { |