From c0f632d6b23d808bbdc131fa3ab8a8ff47b4a8e6 Mon Sep 17 00:00:00 2001
From: Mike Stump <mrs@apple.com>
Date: Wed, 18 Nov 2009 04:00:48 +0000
Subject: [PATCH] Set up vtable visibility appropriately.

llvm-svn: 89193
---
 clang/lib/CodeGen/CGVtable.cpp | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/clang/lib/CodeGen/CGVtable.cpp b/clang/lib/CodeGen/CGVtable.cpp
index efca4f2fbe88..4c97a9bdeebf 100644
--- a/clang/lib/CodeGen/CGVtable.cpp
+++ b/clang/lib/CodeGen/CGVtable.cpp
@@ -813,10 +813,13 @@ llvm::Constant *CodeGenModule::GenerateVtable(const CXXRecordDecl *LayoutClass,
   llvm::Constant *C;
   llvm::ArrayType *type = llvm::ArrayType::get(Ptr8Ty, methods.size());
   C = llvm::ConstantArray::get(type, methods);
-  llvm::Constant *vtable = new llvm::GlobalVariable(getModule(), type,
-                                                    true, linktype, C,
-                                                    Out.str());
-  vtable = llvm::ConstantExpr::getBitCast(vtable, Ptr8Ty);
+  llvm::GlobalVariable *GV = new llvm::GlobalVariable(getModule(), type,
+                                                      true, linktype, C,
+                                                      Out.str());
+  bool Hidden = getDeclVisibilityMode(RD) == LangOptions::Hidden;
+  if (Hidden)
+    GV->setVisibility(llvm::GlobalVariable::HiddenVisibility);
+  llvm::Constant *vtable = llvm::ConstantExpr::getBitCast(GV, Ptr8Ty);
   llvm::Constant *AddressPointC;
   uint32_t LLVMPointerWidth = getContext().Target.getPointerWidth(0);
   AddressPointC = llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
@@ -1011,10 +1014,12 @@ llvm::Constant *CodeGenModule::GenerateVTT(const CXXRecordDecl *RD) {
   llvm::Constant *C;
   llvm::ArrayType *type = llvm::ArrayType::get(Ptr8Ty, inits.size());
   C = llvm::ConstantArray::get(type, inits);
-  llvm::Constant *vtt = new llvm::GlobalVariable(getModule(), type, true,
+  llvm::GlobalVariable *vtt = new llvm::GlobalVariable(getModule(), type, true,
                                                  linktype, C, Out.str());
-  vtt = llvm::ConstantExpr::getBitCast(vtt, Ptr8Ty);
-  return vtt;
+  bool Hidden = getDeclVisibilityMode(RD) == LangOptions::Hidden;
+  if (Hidden)
+    vtt->setVisibility(llvm::GlobalVariable::HiddenVisibility);
+  return llvm::ConstantExpr::getBitCast(vtt, Ptr8Ty);
 }
 
 llvm::Constant *CGVtableInfo::getVtable(const CXXRecordDecl *RD) {