<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, Mar 29, 2014 at 8:09 AM, Tim Northover <span dir="ltr"><<a href="mailto:tnorthover@apple.com" target="_blank">tnorthover@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: tnorthover<br>
Date: Sat Mar 29 10:09:55 2014<br>
New Revision: 205101<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=205101&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=205101&view=rev</a><br>
Log:<br>
CodeGen: Allow different RTTI emission strategies<br>
<br>
Some ABIs and C++ libraries may make different trade-offs in how RTTI<br>
is emitted (currently with respect to visibility and so on). This<br>
implements one scheme, as used by ARM64.<br>
<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/CGRTTI.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGRTTI.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGRTTI.cpp?rev=205101&r1=205100&r2=205101&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGRTTI.cpp?rev=205101&r1=205100&r2=205101&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGRTTI.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGRTTI.cpp Sat Mar 29 10:09:55 2014<br>
@@ -508,6 +508,52 @@ void RTTIBuilder::BuildVTablePointer(con<br>
   Fields.push_back(VTable);<br>
 }<br>
<br>
+/// What sort of unique-RTTI behavior should we use?<br>
+enum UniqueRTTIKind {<br></blockquote><div><br></div><div>Would something like RTTIUniqueness be a better name?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

+  /// We are guaranteeing, or need to guarantee, that the RTTI string<br>
+  /// is unique.<br>
+  UniqueRTTI,<br>
+<br>
+  /// We are not guaranteeing uniqueness for the RTTI string, so we<br>
+  /// can demote to hidden visibility and use string comparisons.<br>
+  NonUniqueHiddenRTTI,<br>
+<br>
+  /// We are not guaranteeing uniqueness for the RTTI string, so we<br>
+  /// have to use string comparisons, but we also have to emit it with<br>
+  /// non-hidden visibility.<br>
+  NonUniqueVisibleRTTI<br>
+};<br>
+<br>
+/// What sort of uniqueness rules should we use for the RTTI for the<br>
+/// given type?<br>
+static UniqueRTTIKind<br>
+classifyUniqueRTTI(CodeGenModule &CGM, QualType canTy,<br>
+                   llvm::GlobalValue::LinkageTypes linkage) {<br>
+  // We only support non-unique RTTI on iOS64.<br>
+  // FIXME: abstract this into CGCXXABI after this code moves to trunk.<br></blockquote><div><br></div><div>You can probably do this now.  :)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

+  if (CGM.getTarget().getCXXABI().getKind() != TargetCXXABI::iOS64)<br>
+    return UniqueRTTI;<br>
+<br>
+  // It's only necessary for linkonce_odr or weak_odr linkage.<br>
+  if (linkage != llvm::GlobalValue::LinkOnceODRLinkage &&<br>
+      linkage != llvm::GlobalValue::WeakODRLinkage)<br>
+    return UniqueRTTI;<br>
+<br>
+  // It's only necessary with default visibility.<br>
+  if (canTy->getVisibility() != DefaultVisibility)<br>
+    return UniqueRTTI;<br>
+<br>
+  // If we're not required to publish this symbol, hide it.<br>
+  if (linkage == llvm::GlobalValue::LinkOnceODRLinkage)<br>
+    return NonUniqueHiddenRTTI;<br>
+<br>
+  // If we're required to publish this symbol, as we might be under an<br>
+  // explicit instantiation, leave it with default visibility but<br>
+  // enable string-comparisons.<br>
+  assert(linkage == llvm::GlobalValue::WeakODRLinkage);<br>
+  return NonUniqueVisibleRTTI;<br>
+}<br>
+<br>
 llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {<br>
   // We want to operate on the canonical type.<br>
   Ty = CGM.getContext().getCanonicalType(Ty);<br>
@@ -544,8 +590,24 @@ llvm::Constant *RTTIBuilder::BuildTypeIn<br>
<br>
   // And the name.<br>
   llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);<br>
+  llvm::Constant *typeNameField;<br></blockquote><div><br></div><div>Can we not flip-flop on variable naming conventions?  The LLVM coding guidelines say to make locals StudlyCaps.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
-  Fields.push_back(llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy));<br>
+  // If we're supposed to demote the visibility, be sure to set a flag<br>
+  // to use a string comparison for type_info comparisons.<br>
+  UniqueRTTIKind uniqueRTTI = classifyUniqueRTTI(CGM, Ty, Linkage);<br>
+  if (uniqueRTTI != UniqueRTTI) {<br></blockquote><div><br></div><div>... besides, I don't like avoiding this collision with case.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

+    // The flag is the sign bit, which on ARM64 is defined to be clear<br>
+    // for global pointers.  This is very ARM64-specific.<br>
+    typeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);<br>
+    llvm::Constant *flag =<br>
+        llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);<br>
+    typeNameField = llvm::ConstantExpr::getAdd(typeNameField, flag);<br>
+    typeNameField =<br>
+        llvm::ConstantExpr::getIntToPtr(typeNameField, CGM.Int8PtrTy);<br>
+  } else {<br>
+    typeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);<br>
+  }<br>
+  Fields.push_back(typeNameField);<br>
<br>
   switch (Ty->getTypeClass()) {<br>
 #define TYPE(Class, Base)<br>
@@ -667,6 +729,12 @@ llvm::Constant *RTTIBuilder::BuildTypeIn<br>
   TypeName->setVisibility(llvmVisibility);<br>
   GV->setVisibility(llvmVisibility);<br>
<br>
+  // FIXME: integrate this better into the above when we move to trunk<br>
+  if (uniqueRTTI == NonUniqueHiddenRTTI) {<br>
+    TypeName->setVisibility(llvm::GlobalValue::HiddenVisibility);<br>
+    GV->setVisibility(llvm::GlobalValue::HiddenVisibility);<br>
+  }<br>
+<br>
   return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);<br>
 }<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>