Commit Graph

12848 Commits

Author SHA1 Message Date
John McCall
c6374093f6 Add support for messaging Objective-C classes.
Notably, there is still no support for +1 return values,
so we'll leak when doing alloc/init and so on;  but this gets
the fundamentals in place.  A lot of the extra stuff in here
is dealing with mapping between metatypes and class objects.

Swift SVN r3425
2012-12-10 08:18:03 +00:00
John McCall
59d4677b35 Implement metatype references to ObjC classes.
The interesting thing here is that we need runtime support in
order to generate references to metatypes for classes, mostly
because normal ObjC classes don't have all the information we want
in a metatype (which for now just means the VWT pointer).
We'll need to be able to reverse this mapping when finding a
class pointer to hand off to, say, an Objective-C class method,
of course.

Swift SVN r3424
2012-12-10 08:17:57 +00:00
Jordan Rose
427be94945 Add the [iboutlet] and [ibaction] attributes.
Currently only used for parsing. The immediate intent of these attributes is
to have them behave like [objc] for the purpose of emitting method
implementations; however, they are semantically distinct and should only be
used to expose outlets and actions to Interface Builder.

Swift SVN r3416
2012-12-08 00:16:03 +00:00
Doug Gregor
1722411007 When we're referring to the SEL type in IRGen, use a names alias for i8*.
Swift SVN r3404
2012-12-07 17:19:39 +00:00
Doug Gregor
07be3f3e7f Use the Objective-C runtime to unique selectors in JIT'd code.
When generating IR for the JIT, use sel_registerName() to unique the
selector references we generate. Static code doesn't need this
pessimization. Fixes <rdar://problem/12764732>.


Swift SVN r3403
2012-12-07 17:13:27 +00:00
Doug Gregor
4c71d7386a Implement getter/setter thunks for imported Objective-C properties.
With this, we are able to access Objective-C properties from within Swift.


Swift SVN r3393
2012-12-07 01:11:52 +00:00
Doug Gregor
aabff2b65b Create a getter thunk for Objective-C subscripts.
Swift SVN r3385
2012-12-06 23:52:16 +00:00
Doug Gregor
aa89f9185b Generate the required AST-level thunk for subscript setters.
An Objective-C subscript setter has a type of the form 

  (this) -> (value, index) -> ()

while a Swift subscript setter has a type of the form

  (this) -> (index) (value) -> ()

Introduce a Swift "thunk" with the latter signature that simply calls
the underlying Objective-C method, and make sure that thunk gets
type-checked and IR-generated appropriately.


Swift SVN r3382
2012-12-06 19:28:11 +00:00
Doug Gregor
ba4abb20df Improve tracking of which external definitions have been type-checked and IRgen'd.
Swift SVN r3380
2012-12-06 17:42:49 +00:00
Doug Gregor
33671da166 Give constructors synthesized as part of loading a Clang module internal linkage.
SwiftFoundation should build and link again.


Swift SVN r3375
2012-12-06 00:22:49 +00:00
Doug Gregor
1f45f28837 Emit the constructors synthesized by the Clang importer for ObjC init/new methods.
Note that the constructors we emit don't function yet, since they rely
on the not-yet-implemented class message sends to Objective-C
methods.


Swift SVN r3370
2012-12-05 22:01:38 +00:00
Doug Gregor
a221a6986b Rename the "allocating" attribute to "allocates_this".
Swift SVN r3353
2012-12-04 20:20:58 +00:00
Doug Gregor
08c9b5c7b2 Allocating constructors are expected to allocate and assign 'this' on their own.
This implementation is very lame, because we don't currently have a
way to detect (in Sema or SIL) where 'this' gets uniquely assigned,
and turn that assignment into initialization.

Also, I'm starting to hate the name 'allocating' constructor, because
it's the opposite of the Itanium C++'s notion of the allocating
constructor. Will think up a better name.




Swift SVN r3347
2012-12-04 01:06:30 +00:00
John McCall
65db19395d Make metatype layout compatible with struct objc_class.
The principal difficulty here is that we need accessing the
value witness table for a type to be an efficient operation,
but there (obviously) isn't a VWT field for ObjC classes.
Placing this field after the metatype would tend to bloat
metatypes by quite a bit.  Placing it before is best, but
it introduces an unfortunate difference between the address
point of a metatype and the address of the global symbol.
That, however, can be fixed with appropriate linker support.
Still, for now this is rather unfortunately over-subtle.

Swift SVN r3307
2012-11-30 02:47:01 +00:00
Doug Gregor
f80ff2c565 Make sure that generated selector symbols actually get uniqued.
First, keep track of each of the selectors we emit and dump them into the
llvm.used global so that they don't get thrown away by the
optimizer. Second, emit Objective-C module-level named metadata so
that the linker knows it needs to unique selectors. Otherwise,
uniquing doesn't happen when Swift code is compiled into a separate
dylib.


Swift SVN r3287
2012-11-29 00:56:41 +00:00
Doug Gregor
d774de0c11 Any method marked [objc] should be called via objc_msgSend*.
Objective-C methods imported from Clang can be part of extensions,
which weren't covered by the existing logic. Note that we currently
ban [objc] methods in extensions written in Swift, a restriction we
may want to revisit.


Swift SVN r3284
2012-11-28 19:16:38 +00:00
Doug Gregor
dc7dcc7fc5 Implement explicit (unchecked!) downcasting for class types.
This introduces support for the syntax

  Derived(baseObj)

to downcast from a class type to one of its subclasses. This still
needs more language design and implementation work, including:
  - This overloads the X(y) syntax again, which already means either
  "coerce y to type X, performing implicit conversions if necessary"
  or "construct a value of type X from y". It's no actually ambiguous,
  because the first case won't apply for downcasts and the second case
  is limited to value types, but it makes me wonder whether we want a
  different syntax for the first case.

  - We need this to be a checked cast, but don't have the runtime
    infrastructure to do so yet. I've left this as a FIXME.

However, the Objective-C importer is fairly useless because everything
that creates an object returns an "id", "id" maps to "NSObject", and
then the type system doesn't let you get from NSObject back to the
type you care about. So, this lets you explicitly do the cast.



Swift SVN r3279
2012-11-28 16:59:27 +00:00
Doug Gregor
311520a3ec Implement support for calling Objective-C instance methods imported from Clang.
Tweak the import of Objective-C methods to build the proper FuncExpr
and tag the FuncDecl as an Objective-C method, along with a few other
tweaks, so calls to the imported Objective-C methods go through
objc_msgSend().

At this moment, this is aborting in the Objective-C runtime due to an
unrecognized selector. The issue does not appear related to the
importer.


Swift SVN r3255
2012-11-27 07:50:52 +00:00
Doug Gregor
83f2874ba1 Implement support for calling imported C functions from Swift.
There is no protection whatsoever if the Clang-to-Swift type
conversion produces something that Swift doesn't lower in an
ABI-compatible way. That will be dealt with later.


Swift SVN r3249
2012-11-27 00:34:48 +00:00
Chris Lattner
f5e4474c76 fix build with mainline llvm.
Swift SVN r3246
2012-11-26 20:44:27 +00:00
Doug Gregor
bb26f52585 Initial support for loading Clang modules into Swift.
From a user's perspective, one imports Clang modules using the normal
Swift syntax for module imports, e.g.,

  import Cocoa

However, to enable importing Clang modules, one needs to point Swift
at a particular SDK with the -sdk= argument, e.g.,

  swift -sdk=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9M.sdk

and, of course, that SDK needs to provide support for modules.

There are a number of moving parts here. The major pieces are:

CMake support for linking Clang into Swift: CMake users will now need
to set the SWIFT_PATH_TO_CLANG_SOURCE and SWIFT_PATH_TO_CLANG_BUILD
to the locations of the Clang source tree (which defaults to
tools/clang under your LLVM source tree) and the Clang build tree.

Makefile support for linking Clang into Swift: Makefile users will
need to have Clang located in tools/clang and Swift located in
tools/swift, and builds should just work.

Module loader abstraction: similar to Clang's module loader,
a module loader is responsible for resolving a module name to an
actual module, loading that module in the process. It will also be
responsible for performing name lookup into that module.

Clang importer: the only implementation of the module loader
abstraction, the importer creates a Clang compiler instance capable of
building and loading Clang modules. The approach we take here is to
parse a dummy .m file in Objective-C ARC mode with modules enabled,
but never tear down that compilation unit. Then, when we get a request
to import a Clang module, we turn that into a module-load request to
Clang's module loader, which will build an appropriate module
on-the-fly or used a cached module file.

Note that name lookup into Clang modules is not yet
implemented. That's the next major step.



Swift SVN r3199
2012-11-16 18:17:05 +00:00
Joe Groff
7fcaed63c7 IRGen: fix typo in comment
Swift SVN r3194
2012-11-15 22:24:07 +00:00
Joe Groff
cb6d12d52d Revert "WIP"
Not ready for prime time, sorry.

This reverts commit 3185.

Swift SVN r3189
2012-11-15 00:11:40 +00:00
Joe Groff
9d08711627 WIP
Swift SVN r3187
2012-11-15 00:04:23 +00:00
John McCall
2568c1b043 getSelector -> getObjCSelector per Doug's review.
Swift SVN r3186
2012-11-14 19:30:22 +00:00
John McCall
3c053a7b98 In preparation for shifting the metadata layout, widen
the metadata kind field to a full word.

Swift SVN r3183
2012-11-14 08:45:29 +00:00
John McCall
23651be7ef Don't distinguish between generic and non-generic types in
the metadata kind.

I don't think this is actually a particularly useful thing
to track, especially since a non-generic type can be
generically parented or have a generic superclass or two.

Swift SVN r3182
2012-11-14 08:45:24 +00:00
John McCall
1dd68ef331 Remove an unused field.
Swift SVN r3181
2012-11-14 08:45:20 +00:00
John McCall
5eb36187d6 Teach IR-gen how to emit metatypes for metatypes.
Swift SVN r3180
2012-11-14 08:45:17 +00:00
John McCall
7d69b0e3c5 Metatypes of (metatypes of)* class types have a
non-trivial representation.

This is because subtyping extends infinitely meta-wards
in the metatype hierarchy:  the one thing you can do
with a metatype of a metatype is pull the instance
metatype out, but that instance type is still a subtype
of the instance type of the metatype of the base metatype,
so... just trust me on this.

Swift SVN r3178
2012-11-14 08:45:06 +00:00
Jordan Rose
ac5abd95d0 [CMake] Automagically add private headers in Xcode as well as public headers.
Swift SVN r3167
2012-11-13 19:05:17 +00:00
Joe Groff
83e1e917d1 Update some inaccurate comments in IRGen
Swift SVN r3139
2012-11-07 18:12:51 +00:00
John McCall
c1f55327a8 Add missing file to CMakeLists.
Swift SVN r3105
2012-11-03 00:26:57 +00:00
John McCall
7c277001a4 Implement basic objc_msgSend capabilities.
Swift SVN r3104
2012-11-03 00:26:56 +00:00
Joe Groff
6449655e21 Implement selector-style function definition syntax.
rdar://12315571
Allow a function to be defined with this syntax:

  func doThing(a:Thing) withItem(b:Item) -> Result { ... }

This allows the keyword names in the function type (in this case
`(_:Thing, withItem:Item) -> Result`) to differ from the names bound in the
function body (in this case `(a:Thing, b:Item) -> Result`, which allows
for Cocoa-style `verbingNoun` keyword idioms to be used without requiring
those keywords to also be used as awkward variable names. In addition
to modifying the parser, this patch extends the FuncExpr type by replacing
the former `getParamPatterns` accessor with separate `getArgParamPatterns`
and `getBodyParamPatterns`, which retrieve the argument name patterns and
body parameter binding patterns respectively.



Swift SVN r3098
2012-11-01 21:53:15 +00:00
John McCall
ce7ddef710 Change value witnesses to take the metatype as 'self'.
The motivations here are that (1) the parametric types
that actually need the 'self' argument don't necessarily
all want to do what tuples do and put the VWT relative
to the metatype at some definable offset and (2)
recovering type parameters from the metatype is much
better defined than also hopping some relationship back.
Plus this allows VWTs to be shared across instances of
generic types.  Also, I'm going to need to add a VW
that takes a metatype, and consistency seems right here.

If keeping two values live is actually punishing, I
might have to reconsider this.  But the VWT is at least
always recoverable from the metatype, so....

I ended up abstracting the thing that GenHeap was doing
in order to save archetypes for arrays, because I
needed it to save metatypes instead of VWTs and because
it really needed abstractin'.

Swift SVN r3096
2012-10-31 08:09:33 +00:00
John McCall
310268c4fd Fix several bugs in the emission of metatype references.
In particular, fix a bug where DREs that refer to types were
always given trivial reps because we were trying to emit the
metatype's metatype.  This in turn exposes a number of bugs,
including a typechecker bug (where GetMetatypeExpr bases
weren't converted to r-values) and a bug where MREs that
refer to types were always assumed to produce trivial reps.

Swift SVN r3095
2012-10-31 08:09:28 +00:00
John McCall
7a95ef9a5f Add code to generate the globals behind selectors.
Untestable so far.

Swift SVN r3090
2012-10-30 00:21:16 +00:00
John McCall
07482e6de1 If the root class in a hierarchy is marked with [objc], we
have to use objc_retain/release.

Swift SVN r3089
2012-10-30 00:20:40 +00:00
John McCall
84f3b7f884 Unify the ObjC and Swift heap pointer TypeInfos.
Swift SVN r3088
2012-10-30 00:19:33 +00:00
Doug Gregor
b10920d65d Cope with DataLayout::getIntPtrType() change on mainline.
Swift SVN r3073
2012-10-28 03:30:24 +00:00
John McCall
24d819e133 Split BoundGenericType into BoundGeneric{Class,OneOf,Struct}Type.
We'll want a superclass pointer on ClassType and BoundGenericClassType,
and this also makes it easier to detect both kinds of class type.

Swift SVN r3061
2012-10-25 21:44:44 +00:00
John McCall
c8f53e3535 Add a MetatypeConversionExpr for doing derived-to-base
conversions on metatypes;  at runtime it has no effect,
since those conversions are always trivial.  Fix a number
of bugs involving the conversion of metatypes, in both
typecheckers.

Swift SVN r3055
2012-10-25 10:21:44 +00:00
John McCall
2f8f05615e Rename TypeOfExpr / TypeOfInst to MetatypeExpr / MetatypeInst.
Introduce a '.metatype' form in the syntax and do some basic
type-checking that I probably haven't done right.  Change
IR-generation for that and GetMetatypeExpr to use code that
actually honors the dynamic type of an expression.

Swift SVN r3053
2012-10-24 07:54:23 +00:00
John McCall
8999ff03db Remember the metatype for This in a method on a generic
struct so that we can re-use it in the function body,
e.g. if we call another method on the type.

Swift SVN r3048
2012-10-23 23:30:25 +00:00
John McCall
0548cc7cff Cache local metadata in the scope in which we compute it,
to avoid some obvious redundancies.  This also gives us a
more general framework with which to exploit other ways
in which metadata is known.

Swift SVN r3047
2012-10-23 23:30:23 +00:00
John McCall
e8d5f08e94 Fix/suppress some warnings arising in newer clangs
as reported by Chris.

Swift SVN r3044
2012-10-23 08:12:08 +00:00
John McCall
85490080c2 Make protocol thunks expect a metatype pointer (for This) as
their last argument.  Pass it down correctly.

Swift SVN r3042
2012-10-23 07:59:35 +00:00
John McCall
3e0957af8f When emitting a polymorphic signature like <T,U> A<T,U>& -> (),
pass A<T,U>.metatype instead of breaking apart the type.
This is a WIP commit, because it breaks existentials quite
badly.

Swift SVN r3041
2012-10-23 07:59:30 +00:00
Eli Friedman
a9f685d94b Fix my crazy swift.swift inlining hack so it doesn't pull in llvm.global_ctors. <rdar://problem/12539597>.
Swift SVN r3032
2012-10-20 00:01:26 +00:00