Skip to content

Commit 1d3916e

Browse files
committed
Add virtual methods to TypeInfo to do all the buffer operations.
Use them to generate value witnesses when the type has dynamic packing. Regularize the interface for calling value witnesses. Not a huge difference yet, although we do re-use local type data a little more effectively now.
1 parent fec4a76 commit 1d3916e

File tree

12 files changed

+463
-371
lines changed

12 files changed

+463
-371
lines changed

lib/IRGen/GenArchetype.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#include "swift/AST/ASTContext.h"
2020
#include "swift/AST/Types.h"
2121
#include "swift/AST/Decl.h"
22-
#include "swift/AST/IRGenOptions.h"
2322
#include "swift/SIL/SILValue.h"
2423
#include "swift/SIL/TypeLowering.h"
2524
#include "llvm/ADT/SmallString.h"

lib/IRGen/GenEnum.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4342,7 +4342,7 @@ namespace {
43424342
void destructiveProjectDataForLoad(IRGenFunction &IGF,
43434343
SILType T,
43444344
Address enumAddr) const override {
4345-
emitDestructiveProjectEnumDataCall(IGF, T, enumAddr.getAddress());
4345+
emitDestructiveProjectEnumDataCall(IGF, T, enumAddr);
43464346
}
43474347

43484348
void storeTag(IRGenFunction &IGF,
@@ -4351,14 +4351,14 @@ namespace {
43514351
EnumElementDecl *Case) const override {
43524352
emitDestructiveInjectEnumTagCall(IGF, T,
43534353
getTagIndex(Case),
4354-
enumAddr.getAddress());
4354+
enumAddr);
43554355
}
43564356

43574357
llvm::Value *
43584358
emitIndirectCaseTest(IRGenFunction &IGF, SILType T,
43594359
Address enumAddr,
43604360
EnumElementDecl *Case) const override {
4361-
llvm::Value *tag = emitGetEnumTagCall(IGF, T, enumAddr.getAddress());
4361+
llvm::Value *tag = emitGetEnumTagCall(IGF, T, enumAddr);
43624362
llvm::Value *expectedTag = llvm::ConstantInt::get(IGF.IGM.Int32Ty,
43634363
getTagIndex(Case));
43644364
return IGF.Builder.CreateICmpEQ(tag, expectedTag);
@@ -4371,7 +4371,7 @@ namespace {
43714371
llvm::BasicBlock*>> dests,
43724372
llvm::BasicBlock *defaultDest) const override {
43734373
// Switch on the tag value.
4374-
llvm::Value *tag = emitGetEnumTagCall(IGF, T, enumAddr.getAddress());
4374+
llvm::Value *tag = emitGetEnumTagCall(IGF, T, enumAddr);
43754375

43764376
// Create a map of the destination blocks for quicker lookup.
43774377
llvm::DenseMap<EnumElementDecl*,llvm::BasicBlock*> destMap(dests.begin(),
@@ -4426,33 +4426,33 @@ namespace {
44264426
SILType T)
44274427
const override {
44284428
emitAssignWithCopyCall(IGF, T,
4429-
dest.getAddress(), src.getAddress());
4429+
dest, src);
44304430
}
44314431

44324432
void assignWithTake(IRGenFunction &IGF, Address dest, Address src,
44334433
SILType T)
44344434
const override {
44354435
emitAssignWithTakeCall(IGF, T,
4436-
dest.getAddress(), src.getAddress());
4436+
dest, src);
44374437
}
44384438

44394439
void initializeWithCopy(IRGenFunction &IGF, Address dest, Address src,
44404440
SILType T)
44414441
const override {
44424442
emitInitializeWithCopyCall(IGF, T,
4443-
dest.getAddress(), src.getAddress());
4443+
dest, src);
44444444
}
44454445

44464446
void initializeWithTake(IRGenFunction &IGF, Address dest, Address src,
44474447
SILType T)
44484448
const override {
44494449
emitInitializeWithTakeCall(IGF, T,
4450-
dest.getAddress(), src.getAddress());
4450+
dest, src);
44514451
}
44524452

44534453
void destroy(IRGenFunction &IGF, Address addr, SILType T)
44544454
const override {
4455-
emitDestroyCall(IGF, T, addr.getAddress());
4455+
emitDestroyCall(IGF, T, addr);
44564456
}
44574457

44584458
void getSchema(ExplosionSchema &schema) const override {
@@ -4602,14 +4602,14 @@ namespace {
46024602
llvm::Value *getExtraInhabitantIndex(IRGenFunction &IGF,
46034603
Address src,
46044604
SILType T) const override {
4605-
return emitGetExtraInhabitantIndexCall(IGF, T, src.getAddress());
4605+
return emitGetExtraInhabitantIndexCall(IGF, T, src);
46064606
}
46074607

46084608
void storeExtraInhabitant(IRGenFunction &IGF,
46094609
llvm::Value *index,
46104610
Address dest,
46114611
SILType T) const override {
4612-
emitStoreExtraInhabitantCall(IGF, T, index, dest.getAddress());
4612+
emitStoreExtraInhabitantCall(IGF, T, index, dest);
46134613
}
46144614

46154615
APInt

lib/IRGen/GenExistential.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,8 @@ class OpaqueExistentialTypeInfo :
334334
Address srcBuffer = layout.projectExistentialBuffer(IGF, src);
335335
Address destBuffer = layout.projectExistentialBuffer(IGF, dest);
336336
emitInitializeBufferWithCopyOfBufferCall(IGF, metadata,
337-
destBuffer, srcBuffer);
337+
destBuffer,
338+
srcBuffer);
338339
}
339340

340341
void initializeWithTake(IRGenFunction &IGF,
@@ -349,7 +350,8 @@ class OpaqueExistentialTypeInfo :
349350
Address srcBuffer = layout.projectExistentialBuffer(IGF, src);
350351
Address destBuffer = layout.projectExistentialBuffer(IGF, dest);
351352
emitInitializeBufferWithTakeOfBufferCall(IGF, metadata,
352-
destBuffer, srcBuffer);
353+
destBuffer,
354+
srcBuffer);
353355
}
354356

355357
void destroy(IRGenFunction &IGF, Address addr, SILType T) const {
@@ -1524,7 +1526,9 @@ static llvm::Constant *getAssignExistentialsFunction(IRGenModule &IGM,
15241526
emitProjectBufferCall(IGF, destMetadata, destBuffer);
15251527
llvm::Value *srcObject =
15261528
emitProjectBufferCall(IGF, destMetadata, srcBuffer);
1527-
emitAssignWithCopyCall(IGF, destMetadata, destObject, srcObject);
1529+
emitAssignWithCopyCall(IGF, destMetadata,
1530+
Address(destObject, Alignment(1)),
1531+
Address(srcObject, Alignment(1)));
15281532
IGF.Builder.CreateBr(doneBB);
15291533
}
15301534

@@ -1559,7 +1563,8 @@ static llvm::Constant *getAssignExistentialsFunction(IRGenModule &IGM,
15591563
// witness table from the source metadata if we can't use a
15601564
// protocol witness table.
15611565
emitInitializeBufferWithCopyOfBufferCall(IGF, srcMetadata,
1562-
destBuffer, srcBuffer);
1566+
destBuffer,
1567+
srcBuffer);
15631568
IGF.Builder.CreateBr(doneBB);
15641569
}
15651570

@@ -1848,7 +1853,8 @@ void irgen::emitMetatypeOfOpaqueExistential(IRGenFunction &IGF, Address addr,
18481853

18491854
// Project the buffer and apply the 'typeof' value witness.
18501855
Address buffer = existLayout.projectExistentialBuffer(IGF, addr);
1851-
llvm::Value *object = emitProjectBufferCall(IGF, metadata, buffer);
1856+
llvm::Value *object =
1857+
emitProjectBufferCall(IGF, metadata, buffer);
18521858
llvm::Value *dynamicType =
18531859
IGF.Builder.CreateCall(IGF.IGM.getGetDynamicTypeFn(),
18541860
{object, metadata});
@@ -1984,7 +1990,8 @@ irgen::emitIndirectExistentialProjectionWithMetadata(IRGenFunction &IGF,
19841990

19851991
llvm::Value *metadata = layout.loadMetadataRef(IGF, base);
19861992
Address buffer = layout.projectExistentialBuffer(IGF, base);
1987-
llvm::Value *object = emitProjectBufferCall(IGF, metadata, buffer);
1993+
llvm::Value *object =
1994+
emitProjectBufferCall(IGF, metadata, buffer);
19881995

19891996
// If we are projecting into an opened archetype, capture the
19901997
// witness tables.

0 commit comments

Comments
 (0)