Commit Graph

12848 Commits

Author SHA1 Message Date
Joe Groff
18fa3009ea IRGen: Use correct func decl to emit virtual calls
When looking for the least-derived override to index into a vtable, we now have to stop when we see an ObjC decl.

Swift SVN r3890
2013-01-29 01:59:29 +00:00
Joe Groff
95a6e4db87 IRGen: Don't emit ObjC methods into vtables.
ObjC methods always need to be invoked through objc_msgSend, so they shouldn't have vtable slots, and Swift subclasses that override ObjC methods should always insert override slots into their vtables.

Swift SVN r3889
2013-01-29 01:18:47 +00:00
Joe Groff
4186e0e721 IRGen: Emit SIL UpcastExistentialInsts.
This covers the special case in classic IRGen for ErasureExprs from protocol to protocol type.

Swift SVN r3888
2013-01-28 20:02:54 +00:00
Dave Zarzycki
a2435e1044 Fix "continue" in do/while loops
Differing from C will only surprise people. If we want some new do/while
like loop construct that does not evaluate the condition after a
"continue" statement, then we should call the loop construct something
else or invent some kind of new "startover" statement.

Swift SVN r3881
2013-01-26 16:59:04 +00:00
Joe Groff
7b0ef2344d IRGen: Bitcast dtor arguments to RefCountedPtr.
In the SIL for a destructor I emit a call to the base class destructor. Although destructors show up in SIL as their decl type T -> (), internally, they all share an LLVM function type void (%swift.refcounted). If an ApplyInst applies to a destructor, bitcast its argument.

Swift SVN r3875
2013-01-26 00:49:53 +00:00
Joe Groff
68658916df IRGen: Scrub cleanups from ApplyInst explosions.
It looks like CallEmission::emitToExplosion sets up cleanups on its outputs, and I didn't see an immediately apparent way to do so, so this is just a quick hack to scrub those cleanups so they don't interfere with SIL-IRGen.

Swift SVN r3874
2013-01-26 00:49:51 +00:00
Joe Groff
e822b95861 IRGen: Lowering for SIL UpcastInst.
Swift SVN r3873
2013-01-26 00:49:49 +00:00
Joe Groff
5dee8a5dbc Missed a spot.
Swift SVN r3866
2013-01-25 17:56:28 +00:00
Joe Groff
0bf66dae4b IRGen: Separate allocating and initializing ctors.
Emit separate entry points for the allocating and initializing constructors. 'super.constructor' now works for the small subset of cases for which I've implemented sema support.

Swift SVN r3864
2013-01-25 17:50:55 +00:00
Joe Groff
008c296c6f IRGen: Don't emit poly args for static methods.
Static methods and constructors receive class metadata from which they can derive their polymorphic parameters, so adding additional metatype arguments to the function is redundant.

Swift SVN r3862
2013-01-25 17:50:52 +00:00
Joe Groff
f40dfce918 IRGen: Implement SuperConstructorRefCallExprs.
Recognize super.constructor calls in IRGen and generate them as calls to the superclass initializing constructor. Note that super.constructor code still won't execute just yet because classic IRGen doesn't generate initializing constructors.

Swift SVN r3859
2013-01-24 21:58:36 +00:00
Jordan Rose
64719e0be9 [HACK] Fix r3837's test for 10.9 vs. 10.8 systems.
ObviouslUilabilityMacros.h is not the way to go when we're building against
10.9 SDKs on 10.8 systems. Since this is a temporary hack anyway, just make
it based on the  the host syatem ake configuration time, and disable the
failing tests on 10.9.

Swift SVN r3851
2013-01-23 23:23:24 +00:00
Joe Groff
e6d3c3e00c Parser: Parse 'super' expressions.
Set up AST nodes for 'super.<identifier>', 'super.constructor', and 'super[<expr>]' expressions, and implement parsing for them without any sema or backend support.

Swift SVN r3847
2013-01-23 21:24:28 +00:00
Jordan Rose
7654aad18b llvm::Twine can only be used as a temporary.
Fixes r3839.

Swift SVN r3842
2013-01-23 19:41:12 +00:00
Jordan Rose
5f2f5e1713 Selector data symbols should be prefixed with "\01L".
Failing to do this causes linker assertions.

Swift SVN r3841
2013-01-23 18:49:17 +00:00
Jordan Rose
0d0b4af17e HACK: Don't set the Swift bit in class metadata on 10.9.
The libobjc in current builds can't handle it. <rdar://problem/13046897>
We are going to want this bit set, though, so this hack should be
removed once a new libobjc is available. <rdar://problem/13065246>

Swift SVN r3839
2013-01-23 00:01:08 +00:00
Joe Groff
7a7e14a9c5 IRGen: Emit SIL destructors.
Emit the SIL destructor as a destroying destructor, then emit a deallocating destructor shim that calls into it and then returns the heap size. (The actual deallocation still happens in swift_release--I talked to John about that and I'll fix it later.) This gets the broken SIL/IRGen class tests passing again.

Swift SVN r3838
2013-01-22 23:36:37 +00:00
Joe Groff
5be34d6337 IRGen: Fix type of initing ctor, destroying dtor
IRGen was generating the exact same signature for the initializing/allocating constructors and destroying/deallocating destructors. Make it do the right thing by typing the initializing constructor as Swift T -> (...) -> T and the destroying destructor as LLVM void(%swift.refcounted*). (This will later change to '%swift.refcounted*(%swift.refcounted*)' pending some irgen/runtime cleanup.)

Swift SVN r3837
2013-01-22 23:36:35 +00:00
Joe Groff
5852448152 IRGen: Generate SIL ctor and property decls.
Remove the filter that only irgenned SIL functions for FuncDecls so that we emit functions for all SIL decls, and disable the old paths for properties, constructors, and destructors when a SIL module is present. Unfortunately this breaks class constructors because SIL and IRGen don't agree on how initializing constructors should work. I need to sync with John to figure out how to fix that.

Swift SVN r3827
2013-01-22 02:45:27 +00:00
Joe Groff
ae396e3905 IRGen: SIL AllocRefInst.
Implement AllocRefInst so that SIL-emitted constructors can be irgenned. Factor the code for allocating a class instance from GenClass's emitClassConstructor function.

Swift SVN r3826
2013-01-22 02:45:25 +00:00
Dave Zarzycki
2f31759280 Remove SemiStmt class
We have no intention of ever supporting actual semicolon statements
(separators, statements no), nor do we ever want to because that would
mean the behavior of the program would potentially change if semicolons
were naively removed.

This patch tracks the trailing semicolon now in the decl/expr/stmt,
which will enable someone to write a good "swift indent" tool in the
future.

Swift SVN r3824
2013-01-22 00:25:26 +00:00
Joe Groff
8c48a3afdd IRGen: Map SIL allocating/initializing ctors.
Now that John's implemented allocating and initializing constructors in irgen, map SIL's representation to irgen's.

Swift SVN r3823
2013-01-21 23:10:08 +00:00
Joe Groff
19d65fede5 IRGen: Visit all SIL Functions in a SILModule.
Make the SIL visitor path a bit less hacky by more cleanly separating the AST walk to find types to codegen from the SIL module walk to find functions to codegen. This way, local functions and other such entry points from SIL actually get generated, and the closures test works.

Swift SVN r3820
2013-01-21 20:17:05 +00:00
Joe Groff
c9d6a351f5 IRGen: SIL ClosureInsts (almost).
Implement lowering of SIL ClosureInsts by packing the partial arguments into a heap allocation and emitting a thunk to unpack them and apply the closure function, similar to curried entry points. The test doesn't work quite yet because nested FuncDecls don't get visited anymore. I need to replace my hacked SIL path with a proper walk of the SIL module to generate functions and the AST to generate types.

Swift SVN r3817
2013-01-20 19:50:10 +00:00
Joe Groff
a17a812ad6 IRGen: Add 'retain' and 'release' to TypeInfos.
These let SILGen retain and release arbitrary Explosions without having to work around cleanups. Also remove 'transfer' because I'm dumb and didn't realize 'reexplode' already does the same thing.

Swift SVN r3816
2013-01-20 19:50:07 +00:00
John McCall
3713b6a549 Add a framework for distinguishing between deallocating
and non-deallocating destructors and allocating/non-allocating
constructors.

Non-deallocating destructors might not play well with ObjC
classes;  we might have to limit them to pure-swift hierarchies.

No functionality change except that I decided to not force
destructors to have internal linkage unconditionally.

Swift SVN r3814
2013-01-20 19:40:12 +00:00
John McCall
7eb4fbd21e Mangle the <context> of an ObjC class as 'So'.
Previously, we were mangling [objc] class types as swift
classes (using the defining component in the mangling) and
imported class types as class types with empty contexts.
This could create an inconsistency between components which
disagree about whether an ObjC class is defined in swift or
not;  this will not do.  Also, an empty context creates an
invalid mangling.

Swift SVN r3812
2013-01-20 19:40:06 +00:00
John McCall
18cde6ed7c ObjC method records have selector data pointers, not
selector ref pointers.

Swift SVN r3808
2013-01-19 10:06:56 +00:00
John McCall
b43d054bde Emit class definitions for classes marked [objc].
This attribute is now a way to mark that a class should be
exported as a normal Objective-C class, not a way to declare
an external Objective-C class.

Swift SVN r3806
2013-01-19 10:06:52 +00:00
John McCall
0877541503 Given selector-data arrays a more semantic name.
Swift SVN r3805
2013-01-19 10:06:50 +00:00
John McCall
2d03621435 Fill in _objc_empty_cache and _objc_empty_vtable.
The ObjC ABI requires these class fields to be initialized by
resolving symbols from the runtime.  So this is a historical
requirement.  Note that there is a desire to optimize this
even for ObjC, because in a project with many classes, these
can actually end up representing a significant fraction of
the external non-lazy relocations in the linked image.  But
for now we follow the spec, as we must.
The ObjC ABI requires these to be taken from the runtime,
although there is an effort to make them not require external
relocations like this, since in large projects it can actually
add up to a large percentage of the non-lazy external relocs.
3,6d
2i

Swift SVN r3804
2013-01-19 10:06:47 +00:00
Joe Groff
5674cfd0b1 IRGen: SIL literals and zero initialization.
Pick up the remaining low-hanging fruit by implementing irgen for FloatLiteralInst, ZeroValueInst, and ZeroAddrInst.

Swift SVN r3801
2013-01-18 18:02:10 +00:00
John McCall
9b8cbfc479 Use the type mangler for IR type names.
Swift SVN r3798
2013-01-18 09:06:14 +00:00
John McCall
f166686df0 Permit invoking the mangler with either a buffer or a stream.
Swift SVN r3797
2013-01-18 09:06:11 +00:00
John McCall
9a4984b836 Use mangled type names for classes unless exporting them as [objc].
Swift SVN r3796
2013-01-18 09:06:09 +00:00
John McCall
9ab2596238 Move everything into the main switch in LinkEntity::mangle.
Swift SVN r3795
2013-01-18 09:06:07 +00:00
Joe Groff
6c6d4dfbdf IRGen: Implement SIL protocol method calls.
Factor out the parts of GenProto's prepareExistentialMemberRefCall necessary to map to SIL's ProtocolMethodInst. Similar to ConstantRefInst, we map the ProtocolMethodInst to an incomplete CallEmission and emit the call when all curry levels have been applied.

Swift SVN r3794
2013-01-18 02:24:26 +00:00
Joe Groff
0422897a47 Expose %swift.opaque as a builtin type.
Archetypes and projected existentials have the type %swift.opaque* and not i8*, so I need a corresponding SIL type to be able to model the ProjectExistential operation. We might also end up needing the builtin type for other low-level things down the line.

Swift SVN r3793
2013-01-18 02:24:23 +00:00
John McCall
02c3c8703d Collect references to non-generic classes in __DATA,__objc_classlist.
Swift SVN r3788
2013-01-17 23:54:09 +00:00
Joe Groff
d2c91a2323 IRGen: SIL protocol type value support.
Factor out the witness table initialization and projection logic from GenProto so that IRGenSIL can use it to implement the ProjectExistential and InitExistential instructions. Also map the CopyAddr and DestroyAddr instructions to value witness table calls so that value semantics on protocol values (and other address-only values) work. The added test compiles but doesn't run yet because invoking methods on a protocol value still requires implementing the ProtocolMethod instruction.

Swift SVN r3787
2013-01-17 23:20:59 +00:00
Joe Groff
1459512901 IRGen: SIL tuple helper instructions.
Implement ElementAddrInst for lvalue tuples, and implement the AllocArray, IndexAddr, and IntegerValue insts used to lower variadic tuples. (Actually compiling code that uses variadic tuples still requires support for SpecializeInst and generic functions.)

Swift SVN r3781
2013-01-17 18:17:39 +00:00
Joe Groff
312e4872e9 IRGen: SIL class accessors.
Implement IRGen for RefElementAddr so that class accessors work. Add a loadUnmanaged method to TypeInfo classes so that we can populate Explosions without accruing unwanted cleanups.

Swift SVN r3779
2013-01-16 22:12:21 +00:00
Joe Groff
7e57041393 IRGen: SIL struct manipulation.
Implement ElementRefInst so that struct accessors work. Also extend SILConstant lowering to support constant_refs to constructors, destructors, and property accessors so that constructor and property accessor references work. (Constructors don't yet get visited by IRGenSIL, though.)

Swift SVN r3776
2013-01-16 19:04:08 +00:00
Joe Groff
5a2d5cc1b1 IRGen: Switch IRGenSIL to use DenseMap.
DenseMap in LLVM now has a move-insert method, so std::map isn't needed to hold noncopyable Explosions and CallEmissions in the IRGenSILFunction object anymore.

Swift SVN r3772
2013-01-16 01:32:27 +00:00
Joe Groff
30a5493250 IRGen: Lower SIL retain instruction.
Oops, I did release but not retain. Like 'release' it currently just does emitRetainCall without checking if the type in question requires ObjC or some other future kind of memory management.

Swift SVN r3770
2013-01-16 01:20:17 +00:00
Joe Groff
afa65ef3f4 IRGen: SIL function arguments and return values.
Lower arguments and value returns instead of assuming all functions are () -> ().

Swift SVN r3769
2013-01-16 01:20:15 +00:00
Joe Groff
9b2727005f IRGen: Add a 'transfer' method to TypeInfo.
Transfers values from one Explosion to another similar to 'copy' by transferring ownership instead of copying the values/cleanups.

Swift SVN r3768
2013-01-16 01:20:13 +00:00
Joe Groff
8320df8b9d IRGen: SIL branching and variable allocation.
Implement SIL-to-IR lowering for allocation, deallocation, load, store, and branching instructions so that local variables and branching control flow can be used. Add a Fibonacci loop test to exercise the new instructions.

Swift SVN r3767
2013-01-15 22:32:49 +00:00
Dave Zarzycki
3b1aef5422 Fix an unused variable build warning
Swift SVN r3763
2013-01-14 22:40:23 +00:00
Dave Zarzycki
7c136717a5 Fix a build warning (missing newline at EOF)
Swift SVN r3762
2013-01-14 22:21:43 +00:00