summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGRTTI.cpp
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-12-24 02:33:48 +0000
committerMike Stump <mrs@apple.com>2009-12-24 02:33:48 +0000
commitbb2f57dd39c9dd1d0ec991cdf74c80f33999762f (patch)
tree8602bd34a7350bfbe39b57c752d941dd21dd644a /clang/lib/CodeGen/CGRTTI.cpp
parent3a509cd8ccdd07c6bcc3fb0dc8084f4aea5d4659 (diff)
downloadbcm5719-llvm-bb2f57dd39c9dd1d0ec991cdf74c80f33999762f.tar.gz
bcm5719-llvm-bb2f57dd39c9dd1d0ec991cdf74c80f33999762f.zip
Don't set hidden for a non-external symbol as that would make it extenal.
Refine codegen for visibility and hidden. WIP. llvm-svn: 92118
Diffstat (limited to 'clang/lib/CodeGen/CGRTTI.cpp')
-rw-r--r--clang/lib/CodeGen/CGRTTI.cpp30
1 files changed, 29 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGRTTI.cpp b/clang/lib/CodeGen/CGRTTI.cpp
index e2410898453..937a4420ef7 100644
--- a/clang/lib/CodeGen/CGRTTI.cpp
+++ b/clang/lib/CodeGen/CGRTTI.cpp
@@ -262,6 +262,7 @@ public:
return llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), n);
}
+ // FIXME: unify with getTypeInfoLinkage
bool DecideExtern(QualType Ty) {
// For this type, see if all components are never in an anonymous namespace.
if (const MemberPointerType *MPT = Ty->getAs<MemberPointerType>())
@@ -269,12 +270,26 @@ public:
&& DecideExtern(QualType(MPT->getClass(), 0)));
if (const PointerType *PT = Ty->getAs<PointerType>())
return DecideExtern(PT->getPointeeType());
+ if (const FunctionType *FT = Ty->getAs<FunctionType>()) {
+ if (DecideExtern(FT->getResultType()) == false)
+ return false;
+ if (const FunctionProtoType *FPT = Ty->getAs<FunctionProtoType>()) {
+ for (unsigned i = 0; i <FPT->getNumArgs(); ++i)
+ if (DecideExtern(FPT->getArgType(i)) == false)
+ return false;
+ for (unsigned i = 0; i <FPT->getNumExceptions(); ++i)
+ if (DecideExtern(FPT->getExceptionType(i)) == false)
+ return false;
+ return true;
+ }
+ }
if (const RecordType *RT = Ty->getAs<RecordType>())
if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
return !RD->isInAnonymousNamespace() && RD->hasLinkage();
return true;
}
+ // FIXME: unify with DecideExtern
bool DecideHidden(QualType Ty) {
// For this type, see if all components are never hidden.
if (const MemberPointerType *MPT = Ty->getAs<MemberPointerType>())
@@ -282,6 +297,19 @@ public:
&& DecideHidden(QualType(MPT->getClass(), 0)));
if (const PointerType *PT = Ty->getAs<PointerType>())
return DecideHidden(PT->getPointeeType());
+ if (const FunctionType *FT = Ty->getAs<FunctionType>()) {
+ if (DecideHidden(FT->getResultType()) == false)
+ return false;
+ if (const FunctionProtoType *FPT = Ty->getAs<FunctionProtoType>()) {
+ for (unsigned i = 0; i <FPT->getNumArgs(); ++i)
+ if (DecideHidden(FPT->getArgType(i)) == false)
+ return false;
+ for (unsigned i = 0; i <FPT->getNumExceptions(); ++i)
+ if (DecideHidden(FPT->getExceptionType(i)) == false)
+ return false;
+ return true;
+ }
+ }
if (const RecordType *RT = Ty->getAs<RecordType>())
if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
return CGM.getDeclVisibilityMode(RD) == LangOptions::Hidden;
@@ -305,7 +333,7 @@ public:
Info.push_back(BuildName(Ty, Hidden, Extern));
// We always generate these as hidden, only the name isn't hidden.
- return finish(GV, Name, /*Hidden=*/true,
+ return finish(GV, Name, /*Hidden=*/Extern ? true : false,
GetLinkageFromExternFlag(Extern));
}
OpenPOWER on IntegriCloud