diff options
author | Mike Stump <mrs@apple.com> | 2009-12-24 02:33:48 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-12-24 02:33:48 +0000 |
commit | bb2f57dd39c9dd1d0ec991cdf74c80f33999762f (patch) | |
tree | 8602bd34a7350bfbe39b57c752d941dd21dd644a /clang/lib/CodeGen/CGRTTI.cpp | |
parent | 3a509cd8ccdd07c6bcc3fb0dc8084f4aea5d4659 (diff) | |
download | bcm5719-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.cpp | 30 |
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)); } |