aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--lib/CodeGen/CodeGenModule.cpp27
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) {