Commit Graph

64 Commits

Author SHA1 Message Date
John McCall
e249fd680e Destructure result types in SIL function types.
Similarly to how we've always handled parameter types, we
now recursively expand tuples in result types and separately
determine a result convention for each result.

The most important code-generation change here is that
indirect results are now returned separately from each
other and from any direct results.  It is generally far
better, when receiving an indirect result, to receive it
as an independent result; the caller is much more likely
to be able to directly receive the result in the address
they want to initialize, rather than having to receive it
in temporary memory and then copy parts of it into the
target.

The most important conceptual change here that clients and
producers of SIL must be aware of is the new distinction
between a SILFunctionType's *parameters* and its *argument
list*.  The former is just the formal parameters, derived
purely from the parameter types of the original function;
indirect results are no longer in this list.  The latter
includes the indirect result arguments; as always, all
the indirect results strictly precede the parameters.
Apply instructions and entry block arguments follow the
argument list, not the parameter list.

A relatively minor change is that there can now be multiple
direct results, each with its own result convention.
This is a minor change because I've chosen to leave
return instructions as taking a single operand and
apply instructions as producing a single result; when
the type describes multiple results, they are implicitly
bound up in a tuple.  It might make sense to split these
up and allow e.g. return instructions to take a list
of operands; however, it's not clear what to do on the
caller side, and this would be a major change that can
be separated out from this already over-large patch.

Unsurprisingly, the most invasive changes here are in
SILGen; this requires substantial reworking of both call
emission and reabstraction.  It also proved important
to switch several SILGen operations over to work with
RValue instead of ManagedValue, since otherwise they
would be forced to spuriously "implode" buffers.
2016-02-18 01:26:28 -08:00
Dmitri Gribenko
8b86dac8c1 Revert "[gardening] Fix typo: "nul-terminated" → "null-terminated"" 2016-02-13 15:27:53 -08:00
Peter Friese
888d0f3fa6 [gardening] Fix typo: "nul-terminated" → "null-terminated" 2016-02-11 11:03:38 +00:00
Joe Groff
f7291b21ec Runtime: Build with -fvisibility=hidden.
...and explicitly mark symbols we export, either for use by executables or for runtime-stdlib interaction. Until the stdlib supports resilience we have to allow programs to link to these SPI symbols.
2016-02-08 08:06:02 -08:00
Austin Zheng
77918a86ac [SR-88] Reinstate Mirror migration changes, fix test issues
This reverts commit 182bb7f812.
2016-01-27 20:40:52 -08:00
Andrew Trick
182bb7f812 Revert "Merge pull request #1058 from austinzheng/az-port-mirror"
This pull request broke the following tests on several build configurations
(eg --preset=buildbot,tools=RA,stdlib=DA)

    1_stdlib/Reflection.swift
    1_stdlib/ReflectionHashing.swift
    1_stdlib/UnsafePointer.swift.gyb

This reverts commit c223a3bf06, reversing
changes made to 5c2bb09b09.
2016-01-27 10:43:08 -08:00
Austin Zheng
10d5b23c30 [SR-88] Reinstate mirror migration commit
Changes:
- Reverted commit reverting original SR-88 commit
- Removed mirror children helper collections and related code
- Rewrote some tests to keep them working properly
- Wrote two more tests for the three pointer APIs to ensure no crashes if created using a value > Int64.max

This reverts commit 8917eb0e5a.
2016-01-26 19:28:32 -08:00
Mark Lacey
8917eb0e5a Revert "[Runtime][StdLib] Migrate mirrors to use CustomReflectable API, rewrite dump()"
This reverts commit 9798dfd4aa because it
broke the stdlib build.
2016-01-22 08:41:07 -08:00
Dave Abrahams
d72d808225 Merge pull request #838 from austinzheng/az-port-mirror
Migrate mirrors to use CustomReflectable API, rewrite dump()

...and there was much rejoicing.
2016-01-22 03:45:48 -08:00
Slava Pestov
34a4075116 IRGen: Implement resilient enum case numbering
Recent changes added support for resiliently-sized enums, and
enums resilient to changes in implementation strategy.

This patch adds resilient case numbering, fixing the problem
where adding new payload cases would break existing code by
changing the numbering of no-payload cases.

The problem is that internally, enum cases are numbered with payload
cases coming first, followed by no-payload cases. While each list
is itself in declaration order, with new additions coming at the
end, we need to partition it to give us a fast runtime test for
"is this a payload or no-payload case index."

The resilient numbering strategy used here is that the getEnumTag
and destructiveInjectEnumTag value witness functions now take a
tag index in the range [-ElementsWithPayload..ElementsWithNoPayload-1].

Payload elements are numbered in *reverse* declaration order, so
adding new payload cases yields decreasing tag indices, and adding
new no-payload cases yields increasing tag indices, allowing use
sites to be resilient.

This adds the adjustment between 'fragile' and 'resilient' tag
indices in a somewhat unsatisfying manner, because the calculation
could be pushed down further into EnumImplStrategy, simplifying
both the IRGen code and the generated IR. I'll clean this up later.

In the meantime, clean up some other stuff in GenEnum.cpp, mostly
abstracting code that walks cases.
2016-01-21 12:10:57 -08:00
Austin Zheng
9798dfd4aa [Runtime][StdLib] Migrate mirrors to use CustomReflectable API, rewrite dump()
Jira: SR-88
Changes:
- Removed stdlib type conformances to _Reflectable
- Conformed stdlib types to CustomReflectable, CustomPlaygroundQuickLookable
- Rewrote dump() function to not use _reflect()
- CGRect, CGPoint, CGSize now conform to CustomDebugStringConvertible
- Rewrote unit tests for compatibility with new API
2016-01-21 09:44:15 -08:00
Zach Panzarino
e3a4147ac9 Update copyright date 2015-12-31 23:28:40 +00:00
Slava Pestov
096ea38ae1 Runtime: Factor out "class has formal superclass" logic, NFC 2015-12-22 15:30:17 -08:00
Joe Groff
53e38907e9 Remove unused #include. 2015-12-21 12:18:57 -08:00
Daniel Duan
ae601d2744 replace NULL with nullptr 2015-12-20 13:28:21 -08:00
Andrew Trick
a98de1ba1c Add an Optional metadata kind for runtime casts.
Reuses the enum metadata layout and builder because most of the logic is
also required for Optional (generic arg and payload). We may want to
optimize this at some point (Optional doesn't have a Parent), but I
don't see much opportunity.

Note that with this approach there will be no change in metadata layout.
Changing the kind still breaks the ABI of course.

Also leaves the MirrorData summary string as "(Enum Value)". We should
consider changing it.
2015-12-09 15:01:33 -08:00
Joe Groff
76eb96e29e Runtime: Reinstate _stdlib_demangleName hook.
This is needed for Xcode support, even though it appeared dead within the Swift repo itself.
2015-12-04 18:45:51 -08:00
Joe Groff
fed7f79147 Runtime: Static-ize swift_unsafeReflectAny.
The _unsafeReflect entry point never ended up getting used on the Swift side, so don't export it, and remove the _silgen_name'd declaration.
2015-12-02 09:39:29 -08:00
Slava Pestov
9ee10e7d39 IRGen: destructiveProjectEnumData() value witness doesn't need a return value
The rest of the runtime assumes the payload starts at the beginning
of the enum, so simplify some code by removing the return value here.
2015-11-30 13:32:55 -08:00
Joe Groff
9ea30d00fe Runtime: Remove custom operator new(InPlace).
C++ no longer imposes a null check requirement on placement 'new', and clang no longer emits the null check. This hack is no longer needed.
2015-11-18 12:31:24 -08:00
Joe Groff
a3b6bef4e5 Runtime: Use new(InPlace) in more places to avoid unwanted null checks. 2015-11-17 14:13:48 -08:00
Joe Groff
0fc6dc8e3b Runtime: Rename swift_stdlib_getDemangledTypeName to swift_getTypeName and decouple it from String.
Getting the name of a type seems like reasonable core runtime functionality, and something the runtime can cache on its side too. Have the function return a pointer to a raw string in memory owned by the runtime, and have it be wrappen in a Swift.String on the standard library side.
2015-11-17 08:37:50 -08:00
Enrico Granata
868035b7c8 Fix an issue where the PlaygroundQuickLook for an NSRange would cause a crash for certain values
rdar://problem/23153462
2015-11-16 13:26:44 -08:00
Joe Groff
d8b68590c6 Runtime: Remove unused swift_stdlib_demangleName stub. 2015-11-13 12:09:41 -08:00
Joe Groff
49261a03af Runtime/stdlib: Remove _stdlib_getDemangledTypeName.
We don't really need its peculiar behavior characteristics; its uses in the legacy mirror implementations can now be replaced by direct stringification of metatypes.
2015-11-13 08:37:12 -08:00
Joe Groff
69a206229d Runtime: Start splitting out stubs only needed by the standard library.
Set up a separate libSwiftStubs.a archive for C++ stub functionality that's needed by the standard library but not part of the core runtime interface. Seed it with the Stubs.cpp and LibcShims.cpp files, which consist only of stubs, though a few stubs are still strewn across the runtime code base.
2015-11-11 17:28:57 -08:00
Joe Groff
42c71b7972 Don't mangle directness into type metadata symbols.
Anywhere we can't directly address type metadata in Swift, we've found we need a function call. Directness isn't useful here.

Swift SVN r32626
2015-10-12 17:22:40 +00:00
Joe Groff
0cd5aa8c7c Change mangling for the Swift module from 'Ss' to 's'.
'Ss' appears in manglings tens of thousands of times in the standard library and is also incredibly frequent in other modules. This alone is enough to shrink the standard library by 59KB.

Swift SVN r32409
2015-10-02 22:39:44 +00:00
Xin Tong
6fe7d89678 This is part of a series of commits to remove reference forwarding
for some of the ARC entry points. rdar://22724641. After this commit,
swift_unknownRetain will forward no reference.

Swift SVN r32083
2015-09-18 22:14:03 +00:00
Joe Groff
43d620c7e0 IRGen: Export direct metadata symbols at the address point of the metadata object.
This is more resilient, since we want to be able to add more information behind the address point of type objects. The start of the metadata object is now an internal "full metadata" symbol.

Note that we can't do this for known opaque metadata from the C++ runtime, since clang doesn't have a good way to emit offset symbol aliases, so for non-nominal metadata objects we still emit an adjustment inline. We also aren't able to generate references to aliases within the same module due to an MC bug with alias refs on i386 and armv7 (rdar://problem/22450593).

Swift SVN r31523
2015-08-27 05:18:38 +00:00
Joe Groff
f705c561e3 Revert "IRGen: Export direct metadata symbols at the address point of the metadata object."
This reverts commit r31515. It causes an LLVM error on the release bots.

Swift SVN r31516
2015-08-27 01:44:56 +00:00
Joe Groff
8e2ce60f5b IRGen: Export direct metadata symbols at the address point of the metadata object.
This is more resilient, since we want to be able to add more information behind the address point of type objects, and also makes IR a lot less cluttered. The start of the metadata object is now an internal "full metadata" symbol.

Note that we can't do this for known opaque metadata from the C++ runtime, since clang doesn't have a good way to emit offset symbol aliases, so for non-nominal metadata objects we still emit an adjustment inline.

Swift SVN r31515
2015-08-27 01:34:22 +00:00
Roman Levenstein
19155fcd69 Change #if __APPLE__ to #if defined(__APPLE__). NFC.
This is required, because  __APPLE__ can be either defined to 1 or not defined at all.

Swift SVN r31389
2015-08-21 20:43:21 +00:00
Joe Groff
529432fe90 Runtime: Reflect through nested existential containers.
Discovered by DaveA while working on the new print implementation.

Swift SVN r30892
2015-07-31 23:41:15 +00:00
Slava Pestov
d926fbe973 Re-apply "Runtime: Enable reflection for multi-payload enums with non-trivial layout"
This re-applies commit r30215 now that the memory error has been fixed.

Swift SVN r30534
2015-07-23 06:49:24 +00:00
Slava Pestov
df65a196a6 Runtime: Fix memory safety violation in getEnumMirrorInfo()
This got flagged by the ASan bot once "Enable reflection for multi-payload
enums with non-trivial layout" went in, but the problem existed all along.

The field types array is only as large as the number of payload cases, but
we were loading from it unconditionally. We would set payloadType to nullptr
afterwards anyway in this case, but indirect was potentially wrong.

Swift SVN r30533
2015-07-23 06:49:23 +00:00
Michael Gottesman
603dc59248 Revert "Runtime: Enable reflection for multi-payload enums with non-trivial layout"
This reverts commit r30215.

Fixes a bunch of problems on the ASAN bot.

Before:
    Swift :: 1_stdlib/ErrorType.swift
    Swift :: 1_stdlib/Runtime.swift
    Swift :: Constraints/bridging.swift
    Swift :: Constraints/diagnostics.swift
    Swift :: Constraints/lvalues.swift
    Swift :: DebugInfo/variables-repl.swift
    Swift :: Interpreter/enum_runtime_alignment.swift
    Swift :: Interpreter/nil_error_value.swift
    Swift :: Interpreter/return_from_main.swift
    Swift :: Misc/misc_diagnostics.swift
    Swift :: Prototypes/Result.swift
    Swift :: expr/expressions.swift
    Swift-Unit :: runtime/SwiftRuntimeTests/MetadataTest.installCommonValueWitnesses_pod_indirect

After:
    Swift :: Constraints/bridging.swift
    Swift :: Constraints/diagnostics.swift
    Swift :: Constraints/lvalues.swift
    Swift :: Misc/misc_diagnostics.swift
    Swift :: expr/expressions.swift
    Swift-Unit :: runtime/SwiftRuntimeTests/MetadataTest.installCommonValueWitnesses_pod_indirect

Swift SVN r30396
2015-07-20 08:23:07 +00:00
Slava Pestov
f456f0c25c Runtime: Enable reflection for multi-payload enums with non-trivial layout
This came up for multi-payload enums without generic parameters, eg

enum MyError {
  case BusError
  case TrainError(Int)
  case DataLoss(String)
}

Fixes <rdar://problem/21739870>.

Swift SVN r30215
2015-07-15 06:03:30 +00:00
Joe Groff
db0fea590e stdlib: Use unqualified names in 'print'.
Leave the qualification off of enum cases and type names when 'print'-ing them, but keep them on 'debugPrint'. (At least, at the outermost level; since ad-hoc printing of structs and tuples uses debugPrint, we'll still get qualification at depth, which kind of sucks but needs more invasive state management in print to make possible.) Implements rdar://problem/21788604.

Swift SVN r30166
2015-07-13 21:42:11 +00:00
Joe Groff
a9e69dda79 IRGen/Runtime: Mark indirect cases in an enum's field type infos.
And use this information in EnumMirror to project boxed payloads when we encounter them.

Swift SVN r29866
2015-07-02 00:00:42 +00:00
Dmitri Hrybenko
4eb24da01b stdlib: underscore MirrorType
Part of removing the old mirrors.

rdar://21428474

Swift SVN r29833
2015-07-01 04:05:48 +00:00
Dmitri Hrybenko
6bc93d4d79 stdlib: finish renaming QuickLookObject to PlaygroundQuickLook
Part of removing the old mirrors.

rdar://21428474

Swift SVN r29824
2015-07-01 00:31:35 +00:00
Dmitri Hrybenko
7ee84ed6b3 stdlib: rename Reflectable.{getMirror() -> _getMirror()}
Start removing the old mirrors.

rdar://21428474

Swift SVN r29823
2015-07-01 00:31:32 +00:00
Joe Groff
8ec59e5c11 Runtime: Implementation for generic typed boxes.
Provide new swift_{alloc,dealloc,project}Box2 entry points that allocate, project, and deallocate typed boxes using runtime-instantiated metadata. Give these a new metadata kind, so that external tools recognize the difference and can interpret the metadata appropriately.

Swift SVN r29714
2015-06-26 00:06:17 +00:00
Joe Groff
4a3f39761c Runtime: Suppress warnings about extern "C" symbols with C-incompatible types.
These are a necessary evil until we get __attribute__((swiftcall)) or something like it in Clang. (Or rewrite the runtime in Swift.)

Swift SVN r29713
2015-06-25 23:56:52 +00:00
Greg Parker
b9bf94307a [stdlib] Fix some reflection bugs on armv7k.
armv7k can return 16-byte structs in registers, but the Swift side of 
the reflection implementation assumes these structs return in memory.
Adding an intermediating struct for return values with an empty user 
destructor guarantees that they come back in memory.

rdar://21215339


Swift SVN r29274
2015-06-03 06:25:37 +00:00
Ted Kremenek
fa1ba12f22 Revert "Revert "[stdlib] Finish Underscoring the legacy Reflectable protocol""
Swift SVN r29084
2015-05-27 21:49:37 +00:00
Ted Kremenek
1c27893a9f Revert "[stdlib] Finish Underscoring the legacy Reflectable protocol"
Revert this to fix the bots.

Swift SVN r29083
2015-05-27 21:48:28 +00:00
Dave Abrahams
a326cae7d6 [stdlib] Finish Underscoring the legacy Reflectable protocol
Somehow I didn't get an adequate local rebuild and broke the bots!
This fixes it.

Swift SVN r29080
2015-05-27 21:28:07 +00:00
Enrico Granata
8a5726d966 Revert 28997
The consensus is against this change and we're going for a much more targeted fix in PlaygroundLogger only



Swift SVN r28999
2015-05-24 23:16:57 +00:00