Implement -fvisibility.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68369 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 1132c3f..1bf73db 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -113,6 +113,25 @@
   }
 }
 
+static void setGlobalOptionVisibility(llvm::GlobalValue *GV,
+                                      LangOptions::VisibilityMode Vis) {
+  switch (Vis) {
+  default: assert(0 && "Unknown visibility!");
+  case LangOptions::NonVisibility:
+    break;
+  case LangOptions::DefaultVisibility:
+    GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
+    break;
+  case LangOptions::HiddenVisibility:
+    GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
+    break;
+  case LangOptions::ProtectedVisibility:
+    GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
+    break;
+  }
+}
+                                      
+
 /// \brief Retrieves the mangled name for the given declaration.
 ///
 /// If the given declaration requires a mangled name, returns an
@@ -247,7 +266,8 @@
   // -fvisibility, and private_extern.
   if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>())
     setGlobalVisibility(GV, attr->getVisibility());
-  // FIXME: else handle -fvisibility
+  else
+    setGlobalOptionVisibility(GV, getLangOptions().getVisibilityMode());
 
   if (const SectionAttr *SA = D->getAttr<SectionAttr>())
     GV->setSection(SA->getName());
@@ -751,7 +771,8 @@
 
   if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>())
     setGlobalVisibility(GV, attr->getVisibility());
-  // FIXME: else handle -fvisibility
+  else
+    setGlobalOptionVisibility(GV, getLangOptions().getVisibilityMode());
 
   // Set the llvm linkage type as appropriate.
   if (D->getStorageClass() == VarDecl::Static)