@@ -413,45 +413,24 @@ namespace {
413
413
}
414
414
415
415
llvm::Value *getOffsetForIndex (IRGenFunction &IGF, unsigned index) override {
416
- auto &structLayout =
416
+ auto &layout =
417
417
IGF.IGM .getMetadataLayout (TheStruct.getStructOrBoundGenericStruct ());
418
- auto offset =
419
- structLayout.getFieldOffsetVectorOffset ().offsetBy (IGF, Size (index));
420
- auto newRet = offset.getAsValue (IGF);
421
- //
418
+ auto offset = layout.getFieldOffset (
419
+ IGF, layout.getDecl ()->getStoredProperties ()[index]);
420
+
422
421
llvm::Value *metadata = IGF.emitTypeMetadataRefForLayout (TheStruct);
423
422
Address fieldVector = emitAddressOfFieldOffsetVector (IGF, metadata,
424
423
TheStruct.getStructOrBoundGenericStruct ());
425
- fieldVector = IGF.Builder .CreateConstArrayGEP (fieldVector, index,
424
+ auto oldField = IGF.Builder .CreateConstArrayGEP (fieldVector, index,
426
425
IGF.IGM .getPointerSize ());
427
- auto oldRet = IGF.Builder .CreateLoad (fieldVector);
428
- //
429
- // auto offset = structLayout.getFieldOffset(
430
- // IGF, structLayout.getDecl()->getStoredProperties()[index]);
431
- // auto newRet = offset.getAsValue(IGF);
432
- //
433
- // // structLayout.FieldOffsetVector
434
- //
435
- // // auto cmp = IGF.Builder.CreateICmpEQ(fieldVector, <#Value *RHS#>)
436
- // structLayout.getFieldOffsetVectorOffset().getAsValue(IGF)->dump();
437
- //
438
- // newRet->dump();
439
- // oldRet->dump();
440
- // Offset(IGF.IGM.getPointerSize() * index).getAsValue(IGF)->dump();
441
- //
442
- // // auto assertEq = IGF.IGM.Module.getFunction("__swift_assert_equal");
443
- // // IGF.Builder.CreateCall(assertEq->getFunctionType(),
444
- // // assertEq, {oldRet, newRet});
426
+ auto oldRet = IGF.Builder .CreateLoad (oldField);
445
427
446
- // auto newRet = Offset(IGF.IGM.getPointerSize() * index).getAsValue(IGF);
447
- // StructMetadataLayout layout(IGF.IGM, TheStruct.getStructOrBoundGenericStruct()); // IGF.IGM.getMetadataLayout(TheStruct.getStructOrBoundGenericStruct());
448
- // auto fieldOffset = layout.getStaticFieldOffset(layout.getDecl()->getStoredProperties()[index]);
449
- // auto start = layout.getFieldOffsetVectorOffset().getStatic();
450
- // auto rawOffset = Size(fieldOffset - start) * IGF.IGM.getPointerSize().getValue();
451
- // auto newRet = Offset(rawOffset - IGF.IGM.getOffsetOfStructTypeSpecificMetadataMembers()).getAsValue(IGF); // .offsetBy(IGF, IGF.IGM.getOffsetOfStructTypeSpecificMetadataMembers())
428
+ auto field = IGF.emitAddressAtOffset (metadata, offset, IGF.IGM .Int32Ty ,
429
+ IGF.IGM .getPointerAlignment ());
430
+ auto newRet = IGF.Builder .CreateLoad (field);
452
431
453
432
auto assertEqFnTy = llvm::FunctionType::get (IGF.IGM .VoidTy ,
454
- {newRet-> getType (), newRet-> getType () },
433
+ {IGF. IGM . Int64Ty , IGF. IGM . Int64Ty },
455
434
false );
456
435
auto assertEq = IGF.IGM .Module .getOrInsertFunction (" swift_assertEqual" , assertEqFnTy);
457
436
0 commit comments