Address irgen::emitAddressOfClassFieldOffset(IRGenFunction &IGF, llvm::Value *metadata, ClassDecl *theClass, VarDecl *field) { auto offset = IGF.IGM.getClassMetadataLayout(theClass).getFieldOffset(IGF, field); auto slot = IGF.emitAddressAtOffset(metadata, offset, IGF.IGM.SizeTy, IGF.IGM.getPointerAlignment()); return slot; }
Address irgen::emitAddressOfFieldOffsetVector(IRGenFunction &IGF, llvm::Value *metadata, NominalTypeDecl *decl) { auto &layout = IGF.IGM.getMetadataLayout(decl); auto offset = [&]() { if (isa<ClassDecl>(decl)) { return cast<ClassMetadataLayout>(layout) .getFieldOffsetVectorOffset(IGF); } else { assert(isa<StructDecl>(decl)); return cast<StructMetadataLayout>(layout) .getFieldOffsetVectorOffset(); } }(); auto *elementSize = IGF.IGM.SizeTy; if (isa<StructDecl>(decl)) elementSize = IGF.IGM.Int32Ty; return IGF.emitAddressAtOffset(metadata, offset, elementSize, IGF.IGM.getPointerAlignment()); }