From 92028dad66e317561b0e40360e329a9a443eaeb4 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 14 Apr 2009 06:44:48 +0000 Subject: defer emission of always_inline, extern_inline, and inline functions (when not in c89 mode). llvm-svn: 69032 --- clang/lib/CodeGen/CodeGenModule.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'clang/lib/CodeGen/CodeGenModule.cpp') diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 5ef57ffdcc20..c771461704d9 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -482,18 +482,23 @@ bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) { if (FD->hasAttr() || FD->hasAttr()) return false; - // FIXME: What about inline, and/or extern inline? - if (FD->getStorageClass() != FunctionDecl::Static) - return false; - } else { - const VarDecl *VD = cast(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(Global); + assert(VD->isFileVarDecl() && "Invalid decl"); + return VD->getStorageClass() == VarDecl::Static; } void CodeGenModule::EmitGlobal(const ValueDecl *Global) { -- cgit v1.2.3