mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
RemoteAST: implement getOffsetOfMember for structs and classes.
This commit is contained in:
@@ -47,6 +47,8 @@
|
||||
#include "IRGenModule.h"
|
||||
#include "GenHeap.h"
|
||||
#include "HeapTypeInfo.h"
|
||||
#include "Linking.h"
|
||||
#include "MemberAccessStrategy.h"
|
||||
|
||||
|
||||
using namespace swift;
|
||||
@@ -479,6 +481,45 @@ OwnedAddress irgen::projectPhysicalClassMemberAddress(IRGenFunction &IGF,
|
||||
llvm_unreachable("bad field-access strategy");
|
||||
}
|
||||
|
||||
MemberAccessStrategy
|
||||
irgen::getPhysicalClassMemberAccessStrategy(IRGenModule &IGM,
|
||||
SILType baseType, VarDecl *field) {
|
||||
auto &baseClassTI = IGM.getTypeInfo(baseType).as<ClassTypeInfo>();
|
||||
ClassDecl *baseClass = baseType.getClassOrBoundGenericClass();
|
||||
|
||||
auto &classLayout = baseClassTI.getClassLayout(IGM);
|
||||
unsigned fieldIndex = classLayout.getFieldIndex(field);
|
||||
|
||||
switch (classLayout.AllFieldAccesses[fieldIndex]) {
|
||||
case FieldAccess::ConstantDirect: {
|
||||
auto &element = baseClassTI.getElements(IGM)[fieldIndex];
|
||||
return MemberAccessStrategy::getDirectFixed(element.getByteOffset());
|
||||
}
|
||||
|
||||
case FieldAccess::NonConstantDirect: {
|
||||
std::string symbol =
|
||||
LinkEntity::forFieldOffset(field, /*indirect*/ false).mangleAsString();
|
||||
return MemberAccessStrategy::getDirectGlobal(std::move(symbol),
|
||||
MemberAccessStrategy::OffsetKind::Bytes_Word);
|
||||
}
|
||||
|
||||
case FieldAccess::ConstantIndirect: {
|
||||
Size indirectOffset = getClassFieldOffset(IGM, baseClass, field);
|
||||
return MemberAccessStrategy::getIndirectFixed(indirectOffset,
|
||||
MemberAccessStrategy::OffsetKind::Bytes_Word);
|
||||
}
|
||||
|
||||
case FieldAccess::NonConstantIndirect: {
|
||||
std::string symbol =
|
||||
LinkEntity::forFieldOffset(field, /*indirect*/ true).mangleAsString();
|
||||
return MemberAccessStrategy::getIndirectGlobal(std::move(symbol),
|
||||
MemberAccessStrategy::OffsetKind::Bytes_Word,
|
||||
MemberAccessStrategy::OffsetKind::Bytes_Word);
|
||||
}
|
||||
}
|
||||
llvm_unreachable("bad field-access strategy");
|
||||
}
|
||||
|
||||
/// Emit an allocation of a class.
|
||||
llvm::Value *irgen::emitClassAllocation(IRGenFunction &IGF, SILType selfType,
|
||||
bool objc, int &StackAllocSize) {
|
||||
|
||||
Reference in New Issue
Block a user