aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-04-03 03:28:57 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-04-03 03:28:57 +0000
commit7cd2e93125e2f3b6ca01b24ed0c3fd7e94683fd9 (patch)
tree7429f1db201bd26efb44e3f002e6f8adfb6d95b4 /lib/CodeGen/CodeGenModule.cpp
parentd76e0a6c2262e62d943c120a0a8768943fdbde05 (diff)
Implement -fvisibility.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68369 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--lib/CodeGen/CodeGenModule.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 1132c3f721..1bf73db177 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -113,6 +113,25 @@ static void setGlobalVisibility(llvm::GlobalValue *GV,
}
}
+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 @@ void CodeGenModule::SetGlobalValueAttributes(const Decl *D,
// -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 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
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)