Skip to content

Commit e80455e

Browse files
committed
[RemoteAST] Fix metadata reader to properly read function metadata
1 parent 801b35e commit e80455e

File tree

2 files changed

+40
-43
lines changed

2 files changed

+40
-43
lines changed

include/swift/Remote/MetadataReader.h

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -798,38 +798,22 @@ class MetadataReader {
798798
}
799799
case MetadataKind::Function: {
800800
auto Function = cast<TargetFunctionTypeMetadata<Runtime>>(Meta);
801-
auto numParameters = Function->getNumParameters();
801+
auto *const parameters = Function->getParameters();
802802

803803
std::vector<FunctionParam<BuiltType>> Parameters;
804-
StoredPointer ArgumentAddress = MetadataAddress +
805-
sizeof(TargetFunctionTypeMetadata<Runtime>);
806-
StoredPointer ParameterFlagsAddress =
807-
ArgumentAddress + (numParameters * sizeof(StoredPointer));
808-
809-
for (unsigned i = 0; i < numParameters; ++i,
810-
ArgumentAddress += sizeof(StoredPointer),
811-
ParameterFlagsAddress += sizeof(uint32_t)) {
804+
for (unsigned i = 0, n = Function->getNumParameters(); i != n; ++i) {
812805
StoredPointer ParamMetadata;
813-
if (!Reader->readInteger(RemoteAddress(ArgumentAddress),
814-
&ParamMetadata))
806+
if (!Reader->readInteger(RemoteAddress(parameters + i), &ParamMetadata))
815807
return BuiltType();
816808

817-
if (auto ParamTypeRef = readTypeFromMetadata(ParamMetadata)) {
818-
FunctionParam<BuiltType> Param;
819-
Param.setType(ParamTypeRef);
820-
821-
if (Function->hasParameterFlags()) {
822-
uint32_t ParameterFlags;
823-
if (!Reader->readInteger(RemoteAddress(ParameterFlagsAddress),
824-
&ParameterFlags))
825-
return BuiltType();
826-
Param.setFlags(ParameterFlags::fromIntValue(ParameterFlags));
827-
}
828-
829-
Parameters.push_back(std::move(Param));
830-
} else {
809+
auto ParamTypeRef = readTypeFromMetadata(ParamMetadata);
810+
if (!ParamTypeRef)
831811
return BuiltType();
832-
}
812+
813+
FunctionParam<BuiltType> Param;
814+
Param.setType(ParamTypeRef);
815+
Param.setFlags(Function->getParameterFlags(i));
816+
Parameters.push_back(std::move(Param));
833817
}
834818

835819
auto Result = readTypeFromMetadata(Function->ResultType);
@@ -1203,8 +1187,24 @@ class MetadataReader {
12031187
return _readMetadata<TargetExistentialMetatypeMetadata>(address);
12041188
case MetadataKind::ForeignClass:
12051189
return _readMetadata<TargetForeignClassMetadata>(address);
1206-
case MetadataKind::Function:
1207-
return _readMetadata<TargetFunctionTypeMetadata>(address);
1190+
case MetadataKind::Function: {
1191+
StoredSize flagsValue;
1192+
auto flagsAddr =
1193+
address + TargetFunctionTypeMetadata<Runtime>::OffsetToFlags;
1194+
if (!Reader->readInteger(RemoteAddress(flagsAddr), &flagsValue))
1195+
return nullptr;
1196+
1197+
auto flags =
1198+
TargetFunctionTypeFlags<StoredSize>::fromIntValue(flagsValue);
1199+
1200+
auto totalSize = sizeof(TargetFunctionTypeMetadata<Runtime>) +
1201+
flags.getNumParameters() * sizeof(StoredPointer);
1202+
1203+
if (flags.hasParameterFlags())
1204+
totalSize += flags.getNumParameters() * sizeof(uint32_t);
1205+
1206+
return _readMetadata(address, totalSize);
1207+
}
12081208
case MetadataKind::HeapGenericLocalVariable:
12091209
return _readMetadata<TargetGenericBoxHeapMetadata>(address);
12101210
case MetadataKind::HeapLocalVariable:

include/swift/Runtime/Metadata.h

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,22 +1752,10 @@ struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
17521752
/// The type metadata for the result type.
17531753
ConstTargetMetadataPointer<Runtime, swift::TargetMetadata> ResultType;
17541754

1755-
TargetPointer<Runtime, Parameter> getParameters() {
1756-
return reinterpret_cast<TargetPointer<Runtime, Parameter>>(this + 1);
1757-
}
1758-
1759-
TargetPointer<Runtime, const Parameter> getParameters() const {
1760-
return reinterpret_cast<TargetPointer<Runtime, const Parameter>>(this + 1);
1761-
}
1762-
1763-
TargetPointer<Runtime, uint32_t> getParameterFlags() {
1764-
return reinterpret_cast<TargetPointer<Runtime, uint32_t>>(
1765-
reinterpret_cast<Parameter *>(this + 1) + getNumParameters());
1766-
}
1755+
Parameter *getParameters() { return reinterpret_cast<Parameter *>(this + 1); }
17671756

1768-
TargetPointer<Runtime, const uint32_t> getParameterFlags() const {
1769-
return reinterpret_cast<TargetPointer<Runtime, const uint32_t>>(
1770-
reinterpret_cast<const Parameter *>(this + 1) + getNumParameters());
1757+
const Parameter *getParameters() const {
1758+
return reinterpret_cast<const Parameter *>(this + 1);
17711759
}
17721760

17731761
ParameterFlags getParameterFlags(unsigned index) const {
@@ -1790,6 +1778,15 @@ struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
17901778
static bool classof(const TargetMetadata<Runtime> *metadata) {
17911779
return metadata->getKind() == MetadataKind::Function;
17921780
}
1781+
1782+
uint32_t *getParameterFlags() {
1783+
return reinterpret_cast<uint32_t *>(getParameters() + getNumParameters());
1784+
}
1785+
1786+
const uint32_t *getParameterFlags() const {
1787+
return reinterpret_cast<const uint32_t *>(getParameters() +
1788+
getNumParameters());
1789+
}
17931790
};
17941791
using FunctionTypeMetadata = TargetFunctionTypeMetadata<InProcess>;
17951792

0 commit comments

Comments
 (0)