static void setMetadataRef(IRGenFunction &IGF, ArchetypeType *archetype, llvm::Value *metadata) { assert(metadata->getType() == IGF.IGM.TypeMetadataPtrTy); IGF.setUnscopedLocalTypeData(CanType(archetype), LocalTypeDataKind::forTypeMetadata(), metadata); }
static void setWitnessTable(IRGenFunction &IGF, ArchetypeType *archetype, unsigned protocolIndex, llvm::Value *wtable) { assert(wtable->getType() == IGF.IGM.WitnessTablePtrTy); assert(protocolIndex < archetype->getConformsTo().size()); IGF.setUnscopedLocalTypeData(CanType(archetype), LocalTypeData::forArchetypeProtocolWitness(protocolIndex), wtable); }
void OutliningMetadataCollector::bindMetadataParameters(IRGenFunction &IGF, Explosion ¶ms) const { // Note that our parameter IGF intentionally shadows the IGF that this // collector was built with. for (auto &pair : Values) { llvm::Value *arg = params.claimNext(); auto key = pair.first; assert(key.Kind.isAnyTypeMetadata()); setTypeMetadataName(IGF.IGM, arg, key.Type); IGF.setUnscopedLocalTypeData(key, MetadataResponse::forComplete(arg)); } }
static void setMetadataRef(IRGenFunction &IGF, ArchetypeType *archetype, llvm::Value *metadata) { assert(metadata->getType() == IGF.IGM.TypeMetadataPtrTy); IGF.setUnscopedLocalTypeData(CanType(archetype), LocalTypeData::forMetatype(), metadata); // Create a shadow copy of the metadata in an alloca for the debug info. StringRef Name = metadata->getName(); if (!IGF.IGM.Opts.Optimize) { auto Alloca = IGF.createAlloca(metadata->getType(), IGF.IGM.getPointerAlignment(), Name); IGF.Builder.CreateAlignedStore(metadata, Alloca.getAddress(), IGF.IGM.getPointerAlignment().getValue()); metadata = Alloca.getAddress(); } // Emit debug info for the metadata. if (IGF.IGM.DebugInfo) IGF.IGM.DebugInfo->emitTypeMetadata(IGF, metadata, Name); }