]> granicus.if.org Git - clang/commitdiff
if a decl is both 'static' and weak or static and inline, its linkage
authorChris Lattner <sabre@nondot.org>
Sun, 4 May 2008 01:44:26 +0000 (01:44 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 4 May 2008 01:44:26 +0000 (01:44 +0000)
type should be internal, not weak/linkonce.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50611 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenFunction.cpp
lib/CodeGen/CodeGenModule.cpp

index 1b94c595616d9167c4a8392c60fb08d2a7c8e3b3..bacb610a50a51d3cc21411ef1aa9b9072874bf12 100644 (file)
@@ -159,14 +159,14 @@ void CodeGenFunction::GenerateCode(const FunctionDecl *FD) {
   
   // TODO: Set up linkage and many other things.  Note, this is a simple 
   // approximation of what we really want.
-  if (FD->getAttr<DLLImportAttr>())
+  if (FD->getStorageClass() == FunctionDecl::Static)
+    CurFn->setLinkage(llvm::Function::InternalLinkage);
+  else if (FD->getAttr<DLLImportAttr>())
     CurFn->setLinkage(llvm::Function::DLLImportLinkage);
   else if (FD->getAttr<DLLExportAttr>())
     CurFn->setLinkage(llvm::Function::DLLExportLinkage);
   else if (FD->getAttr<WeakAttr>() || FD->isInline())
     CurFn->setLinkage(llvm::Function::WeakLinkage);
-  else if (FD->getStorageClass() == FunctionDecl::Static)
-    CurFn->setLinkage(llvm::Function::InternalLinkage);
 
   if (FD->getAttr<FastCallAttr>())
     CurFn->setCallingConv(llvm::CallingConv::Fast);
index bf1f0d823d7152315a9ae85a7967f96ce48d95d5..306abd120bdd0fde412f7f3c9c166c4cdaddadcf 100644 (file)
@@ -459,17 +459,19 @@ void CodeGenModule::EmitGlobalVarInit(const VarDecl *D) {
   // FIXME: else handle -fvisibility
   
   // Set the llvm linkage type as appropriate.
-  if (D->getAttr<DLLImportAttr>())
+  if (D->getStorageClass() == VarDecl::Static)
+    GV->setLinkage(llvm::Function::InternalLinkage);
+  else if (D->getAttr<DLLImportAttr>())
     GV->setLinkage(llvm::Function::DLLImportLinkage);
   else if (D->getAttr<DLLExportAttr>())
     GV->setLinkage(llvm::Function::DLLExportLinkage);
-  else if (D->getAttr<WeakAttr>()) {
+  else if (D->getAttr<WeakAttr>())
     GV->setLinkage(llvm::GlobalVariable::WeakLinkage);
-
-  } else {
+  else {
     // FIXME: This isn't right.  This should handle common linkage and other
     // stuff.
     switch (D->getStorageClass()) {
+    case VarDecl::Static: assert(0 && "This case handled above");
     case VarDecl::Auto:
     case VarDecl::Register:
       assert(0 && "Can't have auto or register globals");
@@ -481,9 +483,6 @@ void CodeGenModule::EmitGlobalVarInit(const VarDecl *D) {
     case VarDecl::PrivateExtern:
       // todo: common
       break;
-    case VarDecl::Static:
-      GV->setLinkage(llvm::GlobalVariable::InternalLinkage);
-      break;
     }
   }
 }