defer emission of always_inline, extern_inline, and inline functions (when 
not in c89 mode).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69032 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 5ef57ff..c771461 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -482,18 +482,23 @@
     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");
+    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;
 
-    if (VD->getStorageClass() != VarDecl::Static)
-      return false;
+    // 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) {