summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGRTTI.cpp
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2014-03-30 17:32:48 +0000
committerTim Northover <tnorthover@apple.com>2014-03-30 17:32:48 +0000
commit65f582f432729398265e53d04560e5007cf4ca8a (patch)
tree0a43c9a13522b047a1eff70c34ed0f51608d32a8 /clang/lib/CodeGen/CGRTTI.cpp
parent8baf17fc5fc5605460c793ea3f988e842ccd47d3 (diff)
downloadbcm5719-llvm-65f582f432729398265e53d04560e5007cf4ca8a.tar.gz
bcm5719-llvm-65f582f432729398265e53d04560e5007cf4ca8a.zip
RTTI: refactor the uniqueness question into CGCXXABI.
This also brings the code into closer conformance with usual LLVM coding style and other surrounding conventions. llvm-svn: 205158
Diffstat (limited to 'clang/lib/CodeGen/CGRTTI.cpp')
-rw-r--r--clang/lib/CodeGen/CGRTTI.cpp67
1 files changed, 11 insertions, 56 deletions
diff --git a/clang/lib/CodeGen/CGRTTI.cpp b/clang/lib/CodeGen/CGRTTI.cpp
index c33f088f3c8..7049df7f78a 100644
--- a/clang/lib/CodeGen/CGRTTI.cpp
+++ b/clang/lib/CodeGen/CGRTTI.cpp
@@ -508,52 +508,6 @@ void RTTIBuilder::BuildVTablePointer(const Type *Ty) {
Fields.push_back(VTable);
}
-/// What sort of unique-RTTI behavior should we use?
-enum UniqueRTTIKind {
- /// We are guaranteeing, or need to guarantee, that the RTTI string
- /// is unique.
- UniqueRTTI,
-
- /// We are not guaranteeing uniqueness for the RTTI string, so we
- /// can demote to hidden visibility and use string comparisons.
- NonUniqueHiddenRTTI,
-
- /// We are not guaranteeing uniqueness for the RTTI string, so we
- /// have to use string comparisons, but we also have to emit it with
- /// non-hidden visibility.
- NonUniqueVisibleRTTI
-};
-
-/// What sort of uniqueness rules should we use for the RTTI for the
-/// given type?
-static UniqueRTTIKind
-classifyUniqueRTTI(CodeGenModule &CGM, QualType canTy,
- llvm::GlobalValue::LinkageTypes linkage) {
- // We only support non-unique RTTI on iOS64.
- // FIXME: abstract this into CGCXXABI after this code moves to trunk.
- if (CGM.getTarget().getCXXABI().getKind() != TargetCXXABI::iOS64)
- return UniqueRTTI;
-
- // It's only necessary for linkonce_odr or weak_odr linkage.
- if (linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
- linkage != llvm::GlobalValue::WeakODRLinkage)
- return UniqueRTTI;
-
- // It's only necessary with default visibility.
- if (canTy->getVisibility() != DefaultVisibility)
- return UniqueRTTI;
-
- // If we're not required to publish this symbol, hide it.
- if (linkage == llvm::GlobalValue::LinkOnceODRLinkage)
- return NonUniqueHiddenRTTI;
-
- // If we're required to publish this symbol, as we might be under an
- // explicit instantiation, leave it with default visibility but
- // enable string-comparisons.
- assert(linkage == llvm::GlobalValue::WeakODRLinkage);
- return NonUniqueVisibleRTTI;
-}
-
llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
// We want to operate on the canonical type.
Ty = CGM.getContext().getCanonicalType(Ty);
@@ -590,24 +544,25 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
// And the name.
llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
- llvm::Constant *typeNameField;
+ llvm::Constant *TypeNameField;
// If we're supposed to demote the visibility, be sure to set a flag
// to use a string comparison for type_info comparisons.
- UniqueRTTIKind uniqueRTTI = classifyUniqueRTTI(CGM, Ty, Linkage);
- if (uniqueRTTI != UniqueRTTI) {
+ CGCXXABI::RTTIUniquenessKind RTTIUniqueness =
+ CGM.getCXXABI().classifyRTTIUniqueness(Ty, Linkage);
+ if (RTTIUniqueness != CGCXXABI::RUK_Unique) {
// The flag is the sign bit, which on ARM64 is defined to be clear
// for global pointers. This is very ARM64-specific.
- typeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
+ TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
llvm::Constant *flag =
llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
- typeNameField = llvm::ConstantExpr::getAdd(typeNameField, flag);
- typeNameField =
- llvm::ConstantExpr::getIntToPtr(typeNameField, CGM.Int8PtrTy);
+ TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
+ TypeNameField =
+ llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy);
} else {
- typeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
+ TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
}
- Fields.push_back(typeNameField);
+ Fields.push_back(TypeNameField);
switch (Ty->getTypeClass()) {
#define TYPE(Class, Base)
@@ -730,7 +685,7 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
GV->setVisibility(llvmVisibility);
// FIXME: integrate this better into the above when we move to trunk
- if (uniqueRTTI == NonUniqueHiddenRTTI) {
+ if (RTTIUniqueness == CGCXXABI::RUK_NonUniqueHidden) {
TypeName->setVisibility(llvm::GlobalValue::HiddenVisibility);
GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
}
OpenPOWER on IntegriCloud