diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 855791a..be6ba23 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -222,8 +222,7 @@
 }
 
 void CodeGenModule::SetGlobalValueAttributes(const Decl *D, 
-                                             bool IsInternal,
-                                             bool IsInline,
+                                             GVALinkage Linkage,
                                              llvm::GlobalValue *GV,
                                              bool ForDefinition) {
   // FIXME: Set up linkage and many other things.  Note, this is a simple 
@@ -246,7 +245,7 @@
       // separate linkage types for this. 
       GV->setLinkage(llvm::Function::ExternalWeakLinkage);
     }
-  } else if (IsInternal) {
+  } else if (Linkage == GVA_Internal) {
     GV->setLinkage(llvm::Function::InternalLinkage);
   } else if (D->hasAttr<DLLExportAttr>()) {
     if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
@@ -256,8 +255,9 @@
     } else {
       GV->setLinkage(llvm::Function::DLLExportLinkage);
     }
-  } else if (D->hasAttr<WeakAttr>() || D->hasAttr<WeakImportAttr>() ||
-             IsInline) {
+  } else if (D->hasAttr<WeakAttr>() || D->hasAttr<WeakImportAttr>()) {
+    GV->setLinkage(llvm::Function::WeakAnyLinkage);
+  } else if (Linkage == GVA_Inline || Linkage == GVA_ExternInline) {
     GV->setLinkage(llvm::Function::WeakAnyLinkage);
   }
 
@@ -292,17 +292,29 @@
     F->setCallingConv(llvm::CallingConv::X86_StdCall);
 }
 
+
+static CodeGenModule::GVALinkage 
+GetLinkageForFunctionOrMethodDecl(const Decl *D) {
+  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
+    if (FD->getStorageClass() == FunctionDecl::Static)
+      return CodeGenModule::GVA_Internal;
+    if (FD->isInline()) {
+      if (FD->getStorageClass() == FunctionDecl::Extern)
+        return CodeGenModule::GVA_ExternInline;
+      return CodeGenModule::GVA_Inline;
+    }
+  } else {
+    assert(isa<ObjCMethodDecl>(D));
+    return CodeGenModule::GVA_Internal;
+  }
+  return CodeGenModule::GVA_Normal;
+}
+
 /// SetFunctionAttributesForDefinition - Set function attributes
 /// specific to a function definition.
 void CodeGenModule::SetFunctionAttributesForDefinition(const Decl *D,
                                                        llvm::Function *F) {
-  if (isa<ObjCMethodDecl>(D)) {
-    SetGlobalValueAttributes(D, true, false, F, true);
-  } else {
-    const FunctionDecl *FD = cast<FunctionDecl>(D);
-    SetGlobalValueAttributes(FD, FD->getStorageClass() == FunctionDecl::Static,
-                             FD->isInline(), F, true);
-  }
+  SetGlobalValueAttributes(D, GetLinkageForFunctionOrMethodDecl(D), F, true);
                              
   if (!Features.Exceptions && !Features.ObjCNonFragileABI)
     F->addFnAttr(llvm::Attribute::NoUnwind);  
@@ -325,8 +337,7 @@
                                           llvm::Function *F) {
   SetFunctionAttributes(FD, getTypes().getFunctionInfo(FD), F);
   
-  SetGlobalValueAttributes(FD, FD->getStorageClass() == FunctionDecl::Static,
-                           FD->isInline(), F, false);
+  SetGlobalValueAttributes(FD, GetLinkageForFunctionOrMethodDecl(FD), F, false);
 }
 
 void CodeGenModule::AddUsedGlobal(llvm::GlobalValue *GV) {
@@ -919,7 +930,7 @@
   GA->setName(MangledName);
 
   // Alias should never be internal or inline.
-  SetGlobalValueAttributes(D, false, false, GA, true);
+  SetGlobalValueAttributes(D, GVA_Normal, GA, true);
 }
 
 /// getBuiltinLibFunction - Given a builtin id for a function like
diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h
index b2e6e22..8b748cb 100644
--- a/lib/CodeGen/CodeGenModule.h
+++ b/lib/CodeGen/CodeGenModule.h
@@ -306,7 +306,13 @@
 
   const char *getMangledName(const NamedDecl *ND);
 
-
+  enum GVALinkage {
+    GVA_Internal,
+    GVA_Inline,
+    GVA_ExternInline,
+    GVA_Normal
+  };
+  
 private:
   llvm::Constant *GetOrCreateLLVMFunction(const char *MangledName,
                                           const llvm::Type *Ty,
@@ -314,11 +320,10 @@
   llvm::Constant *GetOrCreateLLVMGlobal(const char *MangledName,
                                         const llvm::PointerType *PTy,
                                         const VarDecl *D);
-    
+  
   /// SetGlobalValueAttributes - Set attributes for a global decl.
   void SetGlobalValueAttributes(const Decl *D, 
-                                bool IsInternal,
-                                bool IsInline,
+                                GVALinkage Linkage,
                                 llvm::GlobalValue *GV,
                                 bool ForDefinition);
     
