Commit Graph

6754 Commits

Author SHA1 Message Date
Dave Abrahams
e4588e4896 Revert "Mangle names of globalinit_{token,func} like other private entities."
This reverts r22795, because it broke my RelWithDebInfo,
SWIFT_OPTIMIZED=NO build.

Swift SVN r22802
2014-10-16 21:12:11 +00:00
Erik Eckstein
b5cfd00f74 Mangle names of globalinit_{token,func} like other private entities.
This allows making global addressors fragile (They use globalinit_{token,func} for initialization of globals).

It has no noticable performance impact on our benchmarks, but it removes an ugly hack which explicitly
prevented addressors from being fragile.



Swift SVN r22795
2014-10-16 08:24:18 +00:00
Joe Groff
e3f9a2035c SIL: Move SILGen and passes over to use "builtin" instead of "apply (builtin_function_ref)".
Swift SVN r22785
2014-10-15 23:37:22 +00:00
Adrian Prantl
414b163bf0 reflow comment
Swift SVN r22783
2014-10-15 23:05:58 +00:00
Adrian Prantl
4ccf572d4f Reapply r22739 using the new DebugLoc mechanism in SILLocation.
Change the SILLocations for enum element dispatches to make the line table
more consistent. emitEnumElementDispatch may be invoked several times so
it should use the location of the first pattern rather than TheSwitch.

Swift SVN r22782
2014-10-15 23:05:57 +00:00
Mark Lacey
350c41c35d Revert "Change the SILLocations for enum element dispatches to make the line table"
This reverts commit r22739 because it broke an unreachable code test
and is blocking the bots.

The problem can be reproduced with:
  swift -frontend  -disable-objc-attr-requires-foundation-module -emit-sil test/SILPasses/unreachable_code.swift -o /dev/null -verify

Swift SVN r22750
2014-10-15 08:47:40 +00:00
Adrian Prantl
d0a3cd65a5 Change the SILLocations for enum element dispatches to make the line table
more consistent. emitEnumElementDispatch may be invoked several times so
it should use the location of the first pattern rather than TheSwitch.

Swift SVN r22739
2014-10-15 00:26:44 +00:00
Chris Lattner
c79e208eac enhance SILGenFunction::emitLoad to know how to produce a loadable value
as +0 when the client requests it.  This avoids emitting some pointless
retain/releases.

This finishes up:
<rdar://problem/17207456> Unable to access dynamicType of an object in a class initializer that isn't done



Swift SVN r22736
2014-10-14 21:57:49 +00:00
Chris Lattner
88df3e4aa0 teach SILGenFunction::emitIgnoredExpr to try a bit harder to avoid
emitting LoadExprs (unless they have a side effect that must be 
emitted).  This is good for -O0 code quality in general, but is important
to avoid materializing 'self' values in initializers that semantically
don't have to happen.

This is progress towards fixing: 
<rdar://problem/17207456> Unable to access dynamicType of an object in a class initializer that isn't done

enabling the struct cases.



Swift SVN r22735
2014-10-14 21:32:01 +00:00
Chris Lattner
558439b507 simplify the implementation of emitMetatypeOfValue a bit, NFC.
Swift SVN r22733
2014-10-14 21:06:15 +00:00
Chris Lattner
63d3c8641e Simplify SILGen to always emit the base of a dynamicType expr at +0,
avoiding some retain/releases.  There is nothing that requires a +1
base and the extra retain/release occasionally get in the way.



Swift SVN r22731
2014-10-14 20:48:01 +00:00
Joe Groff
bb46f4bbd9 SIL: Remove the global_addr instruction.
It's no longer needed now that we always lower to SIL globals.

Swift SVN r22693
2014-10-12 17:19:06 +00:00
Devin Coughlin
6ee6f3d751 [SILGen] Add SILGen for potentially unavailable global functions.
Swift SVN r22692
2014-10-11 23:02:10 +00:00
Joe Groff
c459a57222 SILGen: Allow castFromNativeObject to AnyObject.
And in IRGen, fix up pointer cast codegen to work with types that explode to single scalars while being stored in named structs. Fixes rdar://problem/18604262

Swift SVN r22671
2014-10-10 18:55:21 +00:00
Erik Eckstein
d6861570db Enable whole-module-optimizations for the stdlib and for tests.
This gives about 7% code size reduction in Swift.o



Swift SVN r22659
2014-10-10 09:54:53 +00:00
Adrian Prantl
bb726461b0 Ensure that the line table for the new SIL-generated main function begins
with user code and that the boilerplate is counted towards the prologue.

<rdar://problem/18563763> Setting a breakpoint on "main" in a Swift program doesn't stop at user code

Swift SVN r22611
2014-10-09 02:15:00 +00:00
Erik Eckstein
a99d86d54c Fix wrong updated linkage for globals in a serialize-all compilation.
Swift SVN r22601
2014-10-08 12:38:44 +00:00
John McCall
89e60f31aa Add protocol witness tables to existential metatype
layouts.  Introduce new SIL instructions to initialize
and open existential metatype values.

Don't actually, y'know, lift any of the restriction on
existential metatypes; just pointlessly burn extra
memory storing them.

Swift SVN r22592
2014-10-08 01:20:13 +00:00
Devin Coughlin
6a04c00f6e Add SILGen for UnavailableToOptionalExpr.
This commit adds SILGen for references to potentially unavailable global
variables. We emit .None if the global variable is not available and
.Some(rvalue) if the global variable is available. I will add SILGen
for references to other kinds of potentially unavailable declarations in a
later commit.


Swift SVN r22556
2014-10-06 23:51:52 +00:00
Joe Groff
bbcd3af39f SILGen: Use SIL instructions to directly inject optional values.
Use init_enum_data_addr and inject_enum_addr to construct optional values instead of the injection intrinsics, further simplifying -Onone IR. This not only avoids a call but also allows the frontend to emit optional payloads in-place in more cases, eliminating a lot of stack traffic.

Swift SVN r22549
2014-10-06 20:02:18 +00:00
Joe Groff
a6a68d49cc SILGen: Avoid using a stdlib function to get optional values.
When we've already established that the optional has a value, using unchecked_take_enum_data_addr to directly extract the enum payload is sufficient and avoids a redundant call and check at -Onone. Keep using the _getOptionalValue stdlib function for checked optional wrapping operations such as "x!", so that the stdlib can remain in control of trap handling policy.

The test/SIL/Serialization failures on the bot seem to be happening sporadically independent of this patch, and I can't reproduce failures in any configuration I've tried.

Swift SVN r22537
2014-10-06 15:46:21 +00:00
Joe Groff
069ad18620 Revert "SILGen: Avoid using a stdlib function to get optional values."
This reverts commit r22533. The optimizing bots seem to have problems with it.

Swift SVN r22534
2014-10-06 04:40:58 +00:00
Joe Groff
28805f0d2a SILGen: Avoid using a stdlib function to get optional values.
When we've already established that the optional has a value, using unchecked_take_enum_data_addr to directly extract the enum payload is sufficient and avoids a redundant call and check at -Onone. Keep using the _getOptionalValue stdlib function for checked optional wrapping operations such as "x!", so that the stdlib can remain in control of trap handling policy.

Swift SVN r22533
2014-10-06 04:31:52 +00:00
Joe Groff
cac5807ae2 SILGen: Emit "main" as a SIL function.
Eliminate the intermediate top_level_code function. Now that SIL is expressive enough to express a "main" function, there's no reason for it, and this eliminates a bunch of mystery code in IRGen to thunk from main to top_level_code by reaching for hardcoded symbol names. Demystify the special code for setting up C_ARGC and C_ARGV by having SILGen look for a transparent "_didEnterMain" hook in the stdlib and emit a call to it.

Swift SVN r22525
2014-10-05 04:13:24 +00:00
Joe Groff
13289d421d SILGen: Global accessors must always be non-fragile.
We can't expose the lazy initialization token across module boundaries because that might lead to it being duplicated, which would be bad, so if we were ever going to make them fragile, it would have to happen after a guaranteed globalopt pass. Fixes a crash that was blocking DaveA's work; his incoming patches should exercise this.

Swift SVN r22509
2014-10-03 23:38:08 +00:00
Erik Eckstein
43f68b6974 Enable dead function removal for internal function in whole-module compilation.
This is controlled by a new isWholeModule() attribute in SILModule.

It gives about 9% code size reduction on the benchmark executables.
For test-suite reasons it is currently not done for the stdlib.



Swift SVN r22491
2014-10-03 14:14:23 +00:00
Joe Groff
18e2ab4e0f SILGen/IRGen: Leave stub initializers out of the vtable.
Stub initializers don't get serialized, so this fixes a vtable layout inconsistency when a method of a subclass of a subclass of NSObject is accessed. Fixes rdar://problem/18498385.

Swift SVN r22480
2014-10-02 21:31:35 +00:00
Jordan Rose
3fcdfd40e9 Remove the "swift/Basic/Optional.h" header.
llvm::Optional lives in "llvm/ADT/Optional.h". Like Clang, we can get
Optional in the 'swift' namespace by including "swift/Basic/LLVM.h".

We're now fully switched over to llvm::Optional!

Swift SVN r22477
2014-10-02 18:51:45 +00:00
Jordan Rose
042569a3be Optional: Replace uses of Nothing with None.
llvm::Optional (like Swift.Optional!) uses None as its placeholder value,
not Nothing.

Swift SVN r22476
2014-10-02 18:51:42 +00:00
Jordan Rose
4adeb66b9f Drop uses of Optional's variadic forwarding constructor.
In preparation for the switch to llvm::Optional, which doesn't have this.
I suggested it, but got some pushback from David Blaikie, which is
understandable because implicit conversions are dangerous.
std::experimental::optional also doesn't have this, and we don't use it
too much. The only cost is being slightly more explicit when relying on
conversions to give us a T to then wrap in an Optional.

Swift SVN r22472
2014-10-02 18:51:37 +00:00
Jordan Rose
2a76f18e4b Drop uses of Optional::cache.
In preparation for the switch to llvm::Optional, which doesn't have a 'cache'
method. Given how long we spent bikeshedding over the name and how few places
we ended up using it, I didn't feel like trying to push it through on the
LLVM side.

Swift SVN r22471
2014-10-02 18:51:36 +00:00
Joe Groff
782833f054 SIL: Remove the project_existential* instructions.
Swift SVN r22457
2014-10-02 04:06:10 +00:00
Joe Groff
79e39cd342 SILGen: Replace the remaining uses of project_existential with open_existential.
Swift SVN r22454
2014-10-02 01:02:01 +00:00
Joe Groff
d90a3d6586 SILGen: Remove dead code for special-case lowering of protocol methods.
These now share the archetype code path.

Swift SVN r22444
2014-10-01 21:44:11 +00:00
Joe Groff
23f91d918a SILGen: Open existential bases of property accesses.
Use open_existential/witness_method instead of project_existential/protocol_method for property accessor lookups to, eliminating the remaining uses of protocol_method.

Swift SVN r22443
2014-10-01 21:38:24 +00:00
Joe Groff
a9f0cc0ae7 SILGen: Open existentials when invoking their methods.
This simplifies the code generation path for existential methods by allowing it to shared more code with the generic case, (It'll be even simpler when Sema opens the existentials for SILGen...) turning protocol_method lookups into open_existential + witness_method sequences. In this patch, we handle normal generic method lookups, but property accesses still go through protocol_method.

Swift SVN r22437
2014-10-01 20:15:58 +00:00
John McCall
e71886504a Fix a pair of bugs with property addressors.
No impact on subscript addressors.

Swift SVN r22423
2014-10-01 07:09:15 +00:00
Joe Groff
560f99918a SILGen: Claim orig and subst parameter clauses in sync when emitting calls.
This fixes bugs when we call the result of generic methods that return functions; we were advancing through orig types of the signature but not formal ones, causing us to fall out of sync when we exhausted curry levels of the original function and started calling function-typed results. Fixes rdar://problem/18143223 and rdar://problem/18495979, maybe others too.

Swift SVN r22418
2014-10-01 02:02:21 +00:00
Joe Groff
10eeb06ff0 SILGen: Upcast existentials using open_existential instead of a bespoke instruction.
This will let us eliminate the upcast_existential* instructions altogether.

Swift SVN r22387
2014-09-30 16:11:51 +00:00
John McCall
8c303ef7a6 Representational changes towards get-and-mutableAddress
properties.

The main design change here is that, rather than having
purportedly orthogonal storage kinds and has-addressor
bits, I've merged them into an exhaustive enum of the
possibilities.  I've also split the observing storage kind
into stored-observing and inherited-observing cases, which
is possible to do in the parser because the latter are
always marked 'override' and the former aren't.  This
should lead to much better consideration for inheriting
observers, which were otherwise very easy to forget about.
It also gives us much better recovery when override checking
fails before we can identify the overridden declaration;
previously, we would end up spuriously considering the
override to be a stored property despite the user's
clearly expressed intent.

Swift SVN r22381
2014-09-30 08:39:38 +00:00
Adrian Prantl
e16e9d5a03 Fix a typo.
Swift SVN r22361
2014-09-29 21:13:28 +00:00
Joe Groff
c098645f34 SIL: Conformances relate to formal types, so change witness_method's lookup type to a CanType.
Should be NFC in practice, since only nominal types can currently conform to protocols anyway, but improves modeling of the system.

Swift SVN r22360
2014-09-29 20:44:00 +00:00
Joe Groff
9fb5d59c36 Revert "SILGen: Upcast existentials using open_existential instead of a bespoke instruction."
This reverts commit r22344.

Swift SVN r22354
2014-09-29 13:46:45 +00:00
Devin Coughlin
15eb15598a Add SILGen for API availability query expression.
This patch adds SILGen for the API availability (#os(...)) construct. To do so,
it (1) adds version range information to the AvailabilityQueryExpr AST in Sema,
during type refinement context construction; and (2) uses that version range,
during SILGen, to emit a call to the standard library's
_stdlib_isOSVersionAtLeast function.


Swift SVN r22348
2014-09-29 01:24:36 +00:00
Joe Groff
d639892b4e SILGen: Upcast existentials using open_existential instead of a bespoke instruction.
This will let us eliminate the upcast_existential* instructions altogether.

Swift SVN r22344
2014-09-28 19:24:22 +00:00
Dmitri Hrybenko
d396134832 Portability: use std::make_tuple instead of relying on a libc++
extension (an implicit constructor in std::tuple)

Swift SVN r22339
2014-09-28 18:44:34 +00:00
Joe Groff
5b29b6ea9e Revert "SILGen: Upcast existentials using open_existential instead of a bespoke instruction."
This reverts commit r22332. It somehow exposes a crash bug in LLVM's ARMv7
AsmPrinter.

Swift SVN r22338
2014-09-28 18:41:09 +00:00
Joe Groff
99da363869 SILGen: Upcast existentials using open_existential instead of a bespoke instruction.
This will let us eliminate the upcast_existential* instructions altogether.

Swift SVN r22332
2014-09-28 15:49:49 +00:00
Joe Groff
e7f7033d31 SILGen: Fix up handling of 'self' parameter when opaque protocol requirements are accessed through class-constrained type.
"self" needs to be materialized in these cases. We were handling methods correctly, but not property accesses. Fixes rdar://problem/18454204.

Swift SVN r22309
2014-09-27 02:11:48 +00:00
John McCall
f20225a34b Access properties and subscripts in the most efficient
semantically valid way.

Previously, this decision algorithm was repeated in a
bunch of different places, and it was usually expressed
in terms of whether the decl declared any accessor
functions.  There are, however, multiple reasons why a
decl might provide accessor functions that don't require
it to be accessed through them; for example, we
generate trivial accessors for a stored property that
satisfies a protocol requirement, but non-protocol
uses of the property do not need to use them.

As part of this, and in preparation for allowing
get/mutableAddressor combinations, I've gone ahead and
made l-value emission use-sensitive.  This happens to
also optimize loads from observing properties backed
by storage.

rdar://18465527

Swift SVN r22298
2014-09-26 06:35:51 +00:00