Skip to content

Commit cf0c757

Browse files
committed
[RemoteAST] Fix metadata reader to properly read function metadata
1 parent be3d1af commit cf0c757

File tree

6 files changed

+60
-50
lines changed

6 files changed

+60
-50
lines changed

include/swift/Remote/MetadataReader.h

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -798,38 +798,17 @@ class MetadataReader {
798798
}
799799
case MetadataKind::Function: {
800800
auto Function = cast<TargetFunctionTypeMetadata<Runtime>>(Meta);
801-
auto numParameters = Function->getNumParameters();
802801

803802
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)) {
812-
StoredPointer ParamMetadata;
813-
if (!Reader->readInteger(RemoteAddress(ArgumentAddress),
814-
&ParamMetadata))
803+
for (unsigned i = 0, n = Function->getNumParameters(); i != n; ++i) {
804+
auto ParamTypeRef = readTypeFromMetadata(Function->getParameter(i));
805+
if (!ParamTypeRef)
815806
return BuiltType();
816807

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 {
831-
return BuiltType();
832-
}
808+
FunctionParam<BuiltType> Param;
809+
Param.setType(ParamTypeRef);
810+
Param.setFlags(Function->getParameterFlags(i));
811+
Parameters.push_back(std::move(Param));
833812
}
834813

835814
auto Result = readTypeFromMetadata(Function->ResultType);
@@ -1203,8 +1182,26 @@ class MetadataReader {
12031182
return _readMetadata<TargetExistentialMetatypeMetadata>(address);
12041183
case MetadataKind::ForeignClass:
12051184
return _readMetadata<TargetForeignClassMetadata>(address);
1206-
case MetadataKind::Function:
1207-
return _readMetadata<TargetFunctionTypeMetadata>(address);
1185+
case MetadataKind::Function: {
1186+
StoredSize flagsValue;
1187+
auto flagsAddr =
1188+
address + TargetFunctionTypeMetadata<Runtime>::OffsetToFlags;
1189+
if (!Reader->readInteger(RemoteAddress(flagsAddr), &flagsValue))
1190+
return nullptr;
1191+
1192+
auto flags =
1193+
TargetFunctionTypeFlags<StoredSize>::fromIntValue(flagsValue);
1194+
1195+
using Parameter =
1196+
ConstTargetMetadataPointer<Runtime, swift::TargetMetadata>;
1197+
auto totalSize = sizeof(TargetFunctionTypeMetadata<Runtime>) +
1198+
flags.getNumParameters() * sizeof(Parameter);
1199+
1200+
if (flags.hasParameterFlags())
1201+
totalSize += flags.getNumParameters() * sizeof(uint32_t);
1202+
1203+
return _readMetadata(address, totalSize);
1204+
}
12081205
case MetadataKind::HeapGenericLocalVariable:
12091206
return _readMetadata<TargetGenericBoxHeapMetadata>(address);
12101207
case MetadataKind::HeapLocalVariable:

include/swift/Runtime/Metadata.h

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,29 +1745,22 @@ using EnumMetadata = TargetEnumMetadata<InProcess>;
17451745
template <typename Runtime>
17461746
struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
17471747
using StoredSize = typename Runtime::StoredSize;
1748-
using Parameter = const TargetMetadata<Runtime> *;
1748+
using Parameter = ConstTargetMetadataPointer<Runtime, swift::TargetMetadata>;
17491749

17501750
TargetFunctionTypeFlags<StoredSize> Flags;
17511751

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-
}
1755+
Parameter *getParameters() { return reinterpret_cast<Parameter *>(this + 1); }
17621756

1763-
TargetPointer<Runtime, uint32_t> getParameterFlags() {
1764-
return reinterpret_cast<TargetPointer<Runtime, uint32_t>>(
1765-
reinterpret_cast<Parameter *>(this + 1) + getNumParameters());
1757+
const Parameter *getParameters() const {
1758+
return reinterpret_cast<const Parameter *>(this + 1);
17661759
}
17671760

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());
1761+
Parameter getParameter(unsigned index) const {
1762+
assert(index < getNumParameters());
1763+
return getParameters()[index];
17711764
}
17721765

17731766
ParameterFlags getParameterFlags(unsigned index) const {
@@ -1790,6 +1783,15 @@ struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
17901783
static bool classof(const TargetMetadata<Runtime> *metadata) {
17911784
return metadata->getKind() == MetadataKind::Function;
17921785
}
1786+
1787+
uint32_t *getParameterFlags() {
1788+
return reinterpret_cast<uint32_t *>(getParameters() + getNumParameters());
1789+
}
1790+
1791+
const uint32_t *getParameterFlags() const {
1792+
return reinterpret_cast<const uint32_t *>(getParameters() +
1793+
getNumParameters());
1794+
}
17931795
};
17941796
using FunctionTypeMetadata = TargetFunctionTypeMetadata<InProcess>;
17951797

stdlib/public/runtime/Casting.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1927,7 +1927,7 @@ static bool _dynamicCastToFunction(OpaqueValue *dest,
19271927
return _fail(src, srcType, targetType, flags);
19281928

19291929
for (unsigned i = 0, e = srcFn->getNumParameters(); i < e; ++i) {
1930-
if (srcFn->getParameters()[i] != targetFn->getParameters()[i] ||
1930+
if (srcFn->getParameter(i) != targetFn->getParameter(i) ||
19311931
srcFn->getParameterFlags(i) != targetFn->getParameterFlags(i))
19321932
return _fail(src, srcType, targetType, flags);
19331933
}

stdlib/public/runtime/Demangle.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ swift::_swift_buildDemanglingForMetadata(const Metadata *type,
320320

321321
std::vector<NodePointer> inputs;
322322
for (unsigned i = 0, e = func->getNumParameters(); i < e; ++i) {
323-
auto param = func->getParameters()[i];
323+
auto param = func->getParameter(i);
324324
auto flags = func->getParameterFlags(i);
325325
auto input = _swift_buildDemanglingForMetadata(param, Dem);
326326

stdlib/public/runtime/Metadata.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,10 @@ class FunctionCacheEntry {
337337
Result(result) {}
338338

339339
FunctionTypeFlags getFlags() const { return Flags; }
340-
const Metadata *const *getParameters() const { return Parameters; }
340+
const Metadata *getParameter(unsigned index) const {
341+
assert(index < Flags.getNumParameters());
342+
return Parameters[index];
343+
}
341344
const Metadata *getResult() const { return Result; }
342345

343346
const uint32_t *getParameterFlags() const {
@@ -367,8 +370,8 @@ class FunctionCacheEntry {
367370
return result;
368371

369372
for (unsigned i = 0, e = keyFlags.getNumParameters(); i != e; ++i) {
370-
if (auto result = comparePointers(key.getParameters()[i],
371-
Data.getParameters()[i]))
373+
if (auto result =
374+
comparePointers(key.getParameter(i), Data.getParameter(i)))
372375
return result;
373376

374377
if (auto result =
@@ -537,7 +540,7 @@ FunctionCacheEntry::FunctionCacheEntry(Key key) {
537540
Data.ResultType = key.getResult();
538541

539542
for (unsigned i = 0; i < numParameters; ++i) {
540-
Data.getParameters()[i] = key.getParameters()[i];
543+
Data.getParameters()[i] = key.getParameter(i);
541544
if (flags.hasParameterFlags())
542545
Data.getParameterFlags()[i] = key.getParameterFlags(i).getIntValue();
543546
}

test/RemoteAST/structural_types.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,11 @@ printType(Tuple2.self)
5454
typealias Tuple3 = (x: Int, Float, y: Int.Type)
5555
printType(Tuple3.self)
5656
// CHECK: found type: (x: Int, Float, y: Int.Type)
57+
58+
func foo<T>(_: T) {
59+
var f = T.self
60+
printType(f)
61+
}
62+
63+
foo() { (x: Int) -> Int in return x }
64+
// CHECK: found type: (Int) -> Int

0 commit comments

Comments
 (0)