r205101 - CodeGen: Allow different RTTI emission strategies

David Blaikie dblaikie at gmail.com
Sat Mar 29 10:56:55 PDT 2014


On Sat, Mar 29, 2014 at 10:50 AM, Reid Kleckner <rnk at google.com> wrote:
> On Sat, Mar 29, 2014 at 8:09 AM, Tim Northover <tnorthover at apple.com> wrote:
>>
>> Author: tnorthover
>> Date: Sat Mar 29 10:09:55 2014
>> New Revision: 205101
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=205101&view=rev
>> Log:
>> CodeGen: Allow different RTTI emission strategies
>>
>> Some ABIs and C++ libraries may make different trade-offs in how RTTI
>> is emitted (currently with respect to visibility and so on). This
>> implements one scheme, as used by ARM64.
>>
>> Modified:
>>     cfe/trunk/lib/CodeGen/CGRTTI.cpp
>>
>> Modified: cfe/trunk/lib/CodeGen/CGRTTI.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGRTTI.cpp?rev=205101&r1=205100&r2=205101&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGRTTI.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGRTTI.cpp Sat Mar 29 10:09:55 2014
>> @@ -508,6 +508,52 @@ void RTTIBuilder::BuildVTablePointer(con
>>    Fields.push_back(VTable);
>>  }
>>
>> +/// What sort of unique-RTTI behavior should we use?
>> +enum UniqueRTTIKind {
>
>
> Would something like RTTIUniqueness be a better name?
>
>>
>> +  /// We are guaranteeing, or need to guarantee, that the RTTI string
>> +  /// is unique.
>> +  UniqueRTTI,

Not sure how consistent we are on this, but this doesn't match the
usual enum naming convention of abbreviating the enum name
(URK_Unique, URK_NonUniqueHidden, etc... perhaps)

>> +
>> +  /// 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.
>
>
> You can probably do this now.  :)
>
>>
>> +  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);
>> @@ -544,8 +590,24 @@ llvm::Constant *RTTIBuilder::BuildTypeIn
>>
>>    // And the name.
>>    llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
>> +  llvm::Constant *typeNameField;
>
>
> Can we not flip-flop on variable naming conventions?  The LLVM coding
> guidelines say to make locals StudlyCaps.
>
>>
>>
>> -  Fields.push_back(llvm::ConstantExpr::getBitCast(TypeName,
>> CGM.Int8PtrTy));
>> +  // 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) {
>
>
> ... besides, I don't like avoiding this collision with case.
>
>>
>> +    // 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);
>> +    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);
>> +  } else {
>> +    typeNameField = llvm::ConstantExpr::getBitCast(TypeName,
>> CGM.Int8PtrTy);
>> +  }
>> +  Fields.push_back(typeNameField);
>>
>>    switch (Ty->getTypeClass()) {
>>  #define TYPE(Class, Base)
>> @@ -667,6 +729,12 @@ llvm::Constant *RTTIBuilder::BuildTypeIn
>>    TypeName->setVisibility(llvmVisibility);
>>    GV->setVisibility(llvmVisibility);
>>
>> +  // FIXME: integrate this better into the above when we move to trunk
>> +  if (uniqueRTTI == NonUniqueHiddenRTTI) {
>> +    TypeName->setVisibility(llvm::GlobalValue::HiddenVisibility);
>> +    GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
>> +  }
>> +
>>    return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
>>  }
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>



More information about the cfe-commits mailing list