Skip to content

Commit bd3d743

Browse files
committed
Load offset from metadata instead of returning offset directly
1 parent 7f5f1c3 commit bd3d743

File tree

3 files changed

+11
-38
lines changed

3 files changed

+11
-38
lines changed

lib/IRGen/GenStruct.cpp

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -413,45 +413,24 @@ namespace {
413413
}
414414

415415
llvm::Value *getOffsetForIndex(IRGenFunction &IGF, unsigned index) override {
416-
auto &structLayout =
416+
auto &layout =
417417
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+
422421
llvm::Value *metadata = IGF.emitTypeMetadataRefForLayout(TheStruct);
423422
Address fieldVector = emitAddressOfFieldOffsetVector(IGF, metadata,
424423
TheStruct.getStructOrBoundGenericStruct());
425-
fieldVector = IGF.Builder.CreateConstArrayGEP(fieldVector, index,
424+
auto oldField = IGF.Builder.CreateConstArrayGEP(fieldVector, index,
426425
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);
445427

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);
452431

453432
auto assertEqFnTy = llvm::FunctionType::get(IGF.IGM.VoidTy,
454-
{newRet->getType(), newRet->getType()},
433+
{IGF.IGM.Int64Ty, IGF.IGM.Int64Ty},
455434
false);
456435
auto assertEq = IGF.IGM.Module.getOrInsertFunction("swift_assertEqual", assertEqFnTy);
457436

lib/IRGen/MetadataLayout.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -599,12 +599,6 @@ StructMetadataLayout::StructMetadataLayout(IRGenModule &IGM, StructDecl *decl)
599599
};
600600

601601
Scanner(IGM, decl, *this).layout();
602-
603-
for (auto &field : FieldOffsets) {
604-
printf("static: %llu for field: ",
605-
field.getSecond().getStaticOffset().getValue());
606-
field.getFirst()->dump();
607-
}
608602
}
609603

610604
Offset StructMetadataLayout::getFieldOffset(IRGenFunction &IGF,

lib/IRGen/MetadataLayout.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,6 @@ class EnumMetadataLayout : public NominalMetadataLayout {
309309

310310
/// Layout for struct type metadata.
311311
class StructMetadataLayout : public NominalMetadataLayout {
312-
public:
313312
llvm::DenseMap<VarDecl*, StoredOffset> FieldOffsets;
314313

315314
/// The start of the field-offset vector.
@@ -324,6 +323,7 @@ class StructMetadataLayout : public NominalMetadataLayout {
324323
friend class IRGenModule;
325324
StructMetadataLayout(IRGenModule &IGM, StructDecl *theStruct);
326325

326+
public:
327327
StructDecl *getDecl() const {
328328
return cast<StructDecl>(Nominal);
329329
}

0 commit comments

Comments
 (0)