Skip to content

Commit b1251b3

Browse files
authored
Merge pull request #14125 from xedin/metaprogam-bultin-meta
[Mangled name -> metadata] Add built-in types support
2 parents baee1cd + 86916cf commit b1251b3

File tree

6 files changed

+83
-43
lines changed

6 files changed

+83
-43
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//===--- BuiltinTypes.def - Compiler declaration metaprogramming --*- C++ -*-===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
//
13+
// This file defines macros used for macro-metaprogramming with compiler-known
14+
// built-in types.
15+
//
16+
//===----------------------------------------------------------------------===//
17+
18+
#ifndef BUILTIN_TYPE
19+
# define BUILTIN_TYPE(Symbol, Name)
20+
#endif
21+
22+
BUILTIN_TYPE(Bi8_, "Builtin.Int8")
23+
BUILTIN_TYPE(Bi16_, "Builtin.Int16")
24+
BUILTIN_TYPE(Bi32_, "Builtin.Int32")
25+
BUILTIN_TYPE(Bi64_, "Builtin.Int64")
26+
BUILTIN_TYPE(Bi128_, "Builtin.Int128")
27+
BUILTIN_TYPE(Bi256_, "Builtin.Int256")
28+
BUILTIN_TYPE(Bi512_, "Builtin.Int512")
29+
30+
BUILTIN_TYPE(Bo, "Builtin.NativeObject")
31+
BUILTIN_TYPE(Bb, "Builtin.BridgeObject")
32+
BUILTIN_TYPE(Bp, "Builtin.RawPointer")
33+
BUILTIN_TYPE(BB, "Builtin.UnsafeValueBuffer")
34+
35+
#if SWIFT_OBJC_INTEROP
36+
BUILTIN_TYPE(BO, "Builtin.UnknownObject")
37+
#endif
38+
39+
#undef BUILTIN_TYPE

include/swift/Runtime/Metadata.h

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -984,32 +984,10 @@ using OpaqueMetadata = TargetOpaqueMetadata<InProcess>;
984984
// The "Int" metadata are used for arbitrary POD data with the
985985
// matching characteristics.
986986
using FullOpaqueMetadata = FullMetadata<OpaqueMetadata>;
987-
SWIFT_RUNTIME_EXPORT
988-
const FullOpaqueMetadata METADATA_SYM(Bi8_); // Builtin.Int8
989-
SWIFT_RUNTIME_EXPORT
990-
const FullOpaqueMetadata METADATA_SYM(Bi16_); // Builtin.Int16
991-
SWIFT_RUNTIME_EXPORT
992-
const FullOpaqueMetadata METADATA_SYM(Bi32_); // Builtin.Int32
993-
SWIFT_RUNTIME_EXPORT
994-
const FullOpaqueMetadata METADATA_SYM(Bi64_); // Builtin.Int64
995-
SWIFT_RUNTIME_EXPORT
996-
const FullOpaqueMetadata METADATA_SYM(Bi128_); // Builtin.Int128
997-
SWIFT_RUNTIME_EXPORT
998-
const FullOpaqueMetadata METADATA_SYM(Bi256_); // Builtin.Int256
999-
SWIFT_RUNTIME_EXPORT
1000-
const FullOpaqueMetadata METADATA_SYM(Bi512_); // Builtin.Int512
1001-
SWIFT_RUNTIME_EXPORT
1002-
const FullOpaqueMetadata METADATA_SYM(Bo); // Builtin.NativeObject
1003-
SWIFT_RUNTIME_EXPORT
1004-
const FullOpaqueMetadata METADATA_SYM(Bb); // Builtin.BridgeObject
1005-
SWIFT_RUNTIME_EXPORT
1006-
const FullOpaqueMetadata METADATA_SYM(Bp); // Builtin.RawPointer
1007-
SWIFT_RUNTIME_EXPORT
1008-
const FullOpaqueMetadata METADATA_SYM(BB); // Builtin.UnsafeValueBuffer
1009-
#if SWIFT_OBJC_INTEROP
1010-
SWIFT_RUNTIME_EXPORT
1011-
const FullOpaqueMetadata METADATA_SYM(BO); // Builtin.UnknownObject
1012-
#endif
987+
#define BUILTIN_TYPE(Symbol, Name) \
988+
SWIFT_RUNTIME_EXPORT \
989+
const FullOpaqueMetadata METADATA_SYM(Symbol);
990+
#include "swift/Runtime/BuiltinTypes.def"
1013991

1014992
/// The prefix on a heap metadata.
1015993
struct HeapMetadataHeaderPrefix {

stdlib/public/runtime/Demangle.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,15 @@ _applyGenericArguments(const Metadata * const *genericArgs,
126126
return genericNode;
127127
}
128128

129+
static Demangle::NodePointer
130+
_buildDemanglerForBuiltinType(const Metadata *type, Demangle::Demangler &Dem) {
131+
#define BUILTIN_TYPE(Symbol, Name) \
132+
if (type == &METADATA_SYM(Symbol).base) \
133+
return Dem.createNode(Node::Kind::BuiltinTypeName, Name);
134+
#include "swift/Runtime/BuiltinTypes.def"
135+
return nullptr;
136+
}
137+
129138
// Build a demangled type tree for a nominal type.
130139
static Demangle::NodePointer
131140
_buildDemanglingForNominalType(const Metadata *type, Demangle::Demangler &Dem) {
@@ -451,9 +460,14 @@ swift::_swift_buildDemanglingForMetadata(const Metadata *type,
451460
}
452461
return tupleNode;
453462
}
454-
case MetadataKind::Opaque:
463+
case MetadataKind::Opaque: {
464+
if (auto builtinType = _buildDemanglerForBuiltinType(type, Dem))
465+
return builtinType;
466+
455467
// FIXME: Some opaque types do have manglings, but we don't have enough info
456468
// to figure them out.
469+
break;
470+
}
457471
case MetadataKind::HeapLocalVariable:
458472
case MetadataKind::HeapGenericLocalVariable:
459473
case MetadataKind::ErrorObject:

stdlib/public/runtime/KnownMetadata.cpp

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -156,20 +156,9 @@ const ValueWitnessTable swift::VALUE_WITNESS_SYM(EMPTY_TUPLE_MANGLING) =
156156
{ &VALUE_WITNESS_SYM(TYPE) }, \
157157
{ { MetadataKind::Opaque } } \
158158
};
159-
OPAQUE_METADATA(Bi8_)
160-
OPAQUE_METADATA(Bi16_)
161-
OPAQUE_METADATA(Bi32_)
162-
OPAQUE_METADATA(Bi64_)
163-
OPAQUE_METADATA(Bi128_)
164-
OPAQUE_METADATA(Bi256_)
165-
OPAQUE_METADATA(Bi512_)
166-
OPAQUE_METADATA(Bo)
167-
OPAQUE_METADATA(Bb)
168-
OPAQUE_METADATA(Bp)
169-
OPAQUE_METADATA(BB)
170-
#if SWIFT_OBJC_INTEROP
171-
OPAQUE_METADATA(BO)
172-
#endif
159+
#define BUILTIN_TYPE(Symbol, Name) \
160+
OPAQUE_METADATA(Symbol)
161+
#include "swift/Runtime/BuiltinTypes.def"
173162

174163
/// The standard metadata for the empty tuple.
175164
const FullMetadata<TupleTypeMetadata> swift::

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,10 @@ class DecodedMetadataBuilder {
584584
}
585585

586586
BuiltType createBuiltinType(StringRef mangledName) const {
587-
// FIXME: Implement.
587+
#define BUILTIN_TYPE(Symbol, _) \
588+
if (mangledName.equals(#Symbol)) \
589+
return &METADATA_SYM(Symbol).base;
590+
#include "swift/Runtime/BuiltinTypes.def"
588591
return BuiltType();
589592
}
590593

test/Runtime/demangleToMetadata.swift

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
// RUN: %target-run-simple-swift
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-build-swift -parse-stdlib %s -module-name main -o %t/a.out
3+
// RUN: %target-run %t/a.out
24
// REQUIRES: executable_test
35

6+
import Swift
47
import StdlibUnittest
58

69
let DemangleToMetadataTests = TestSuite("DemangleToMetadata")
@@ -213,5 +216,19 @@ DemangleToMetadataTests.test("nested generic specializations") {
213216
_typeByMangledName("4main3CG2C5InnerC9InnermostVySiSS_Sd_s4Int8Vs5Int16Vs5Int32Vs5Int64VG")!)
214217
}
215218

219+
DemangleToMetadataTests.test("demangle built-in types") {
220+
expectEqual(Builtin.Int8.self, _typeByMangledName("Bi8_")!)
221+
expectEqual(Builtin.Int16.self, _typeByMangledName("Bi16_")!)
222+
expectEqual(Builtin.Int32.self, _typeByMangledName("Bi32_")!)
223+
expectEqual(Builtin.Int64.self, _typeByMangledName("Bi64_")!)
224+
expectEqual(Builtin.Int128.self, _typeByMangledName("Bi128_")!)
225+
expectEqual(Builtin.Int256.self, _typeByMangledName("Bi256_")!)
226+
expectEqual(Builtin.Int512.self, _typeByMangledName("Bi512_")!)
227+
228+
expectEqual(Builtin.NativeObject.self, _typeByMangledName("Bo")!)
229+
expectEqual(Builtin.BridgeObject.self, _typeByMangledName("Bb")!)
230+
expectEqual(Builtin.UnsafeValueBuffer.self, _typeByMangledName("BB")!)
231+
}
232+
216233
runAllTests()
217234

0 commit comments

Comments
 (0)