Commit Graph

12816 Commits

Author SHA1 Message Date
Joe Groff
b057585800 IRGen: Treat class archetypes and protocols Fixed for layout purposes.
This fixes a crash when class archetype- or protocol-typed fields are accessed out

Swift SVN r5706
2013-06-20 03:24:28 +00:00
Joe Groff
470cb9eae0 IRGen: Implement opaque archetype/existential casts.
Use the new swift_dynamicCastIndirect runtime functions to implement casts from opaque archetype and existential types to concrete types.

Swift SVN r5684
2013-06-19 18:56:14 +00:00
Joe Groff
e129ad26d0 Recursively consider ObjC protocol conformances.
Propagate ObjC-ness and emit ObjC thunks and metadata for ObjC protocols indirectly conformed to through protocol refinement.

Swift SVN r5680
2013-06-19 05:35:27 +00:00
Joe Groff
54898bf8fd IRGen: Leave inherited ObjC protocols out of protocol witness tables.
Don't generate parent witness tables for inherited ObjC protocols.

Swift SVN r5678
2013-06-19 04:51:57 +00:00
Joe Groff
4db5b84dde Oops, 'requiresClassExistential' -> 'isClassExistential'.
Clbuttic search-and-replace mistake.

Swift SVN r5675
2013-06-19 04:01:48 +00:00
Joe Groff
a55f246946 Remove the controversial "bounded" from "class-bounded".
Just refer to "class archetypes" and "class protocols". Change 'isClassBounded' methods to 'requiresClass', which is a character shorter.

Swift SVN r5674
2013-06-19 03:58:11 +00:00
Joe Groff
665cbf56c1 IRGen: Implement conversions between class protocol types.
Implement existential upcasts from a class-bounded protocol type to a more general one.

Swift SVN r5673
2013-06-19 02:46:29 +00:00
Joe Groff
f5101ddb97 Stop trusting the inliner to handle trivial 'size()' method calls.
Swift SVN r5671
2013-06-19 01:14:27 +00:00
Joe Groff
dffab88d47 IRGen: Put other contexts' objc conformances in extension categories.
Include methods from other contexts used to conform to an extension's declared objc protocol conformances in the category generated for that extension.

Swift SVN r5669
2013-06-19 00:56:18 +00:00
Joe Groff
514d659ead IRGen: Emit categories for extensions that conform to ObjC protocols.
Swift SVN r5659
2013-06-18 22:37:55 +00:00
Joe Groff
56a4220eeb IRGen: Use superclass repr and refcount for superclass archetypes.
If an archetype has a superclass bound, we can assume the superclass's
retain semantics for the type. We can also use the superclass's storage pointer type to cut down on some bitcast IR noise when calling superclass methods on the archetype value.

Swift SVN r5642
2013-06-18 03:42:27 +00:00
Joe Groff
70a9639057 IRGen: Fix off-by-one in class-bounded existential metadata size.
Swift SVN r5640
2013-06-18 02:06:34 +00:00
Joe Groff
ff5f41b5f0 Archetypes with superclass bounds are class-bounded.
Treat archetypes with a superclass bound as class-bounded. Change SILGen and IRGen to use the new SuperToArchetypeRef and ArchetypeRefToSuper cast instructions, and drop the old SuperToArchetype and ArchetypeToSuper instructions, which are unneeded because any archetype with a superclass will be class-bounded.

Note that this patch doesn't implement representation optimization for archetypes with superclass bounds--they're still always represented with a worst-case UnknownRefCountedPtrTy.

Swift SVN r5629
2013-06-17 21:54:01 +00:00
Joe Groff
dcc414026e IRGen: Lower SIL DeinitExistentialInst.
Provide a lowering for the DeinitExistential instruction to deallocate the buffer in an existential container with an uninitialized value, using its deallocateBuffer witness.

Swift SVN r5623
2013-06-17 19:57:48 +00:00
Joe Groff
4ff8cd27dd IRGen: Abstract out an "unknown refcounted" concept.
In the implementation of class-bounded archetypes and existentials, instead of referring to ObjC pointer types and retain/release operations directly, use an 'UnknownRefCountedPtrTy' and 'emitUnknownRetain/Release' functions.

Swift SVN r5619
2013-06-17 18:31:49 +00:00
Dmitri Hrybenko
49fa6738b9 Remove CPointer<T>, it was almost equivalent to UnsafePointer<T>, but
implemented pointer arithmetic.  Enhanced UnsafePointer<T> to do pointer
arithmetic.

Also: update Clang importer to import T* as UsafePointer<T>, fix standard
library fallout.


Swift SVN r5616
2013-06-17 17:10:08 +00:00
Joe Groff
c3e2afd4ef IRGen: Implement class-bounded generic dynamic casts.
Casts from class-bounded archetypes and existentials can use the existing dynamicCast runtime entry points.

Swift SVN r5614
2013-06-17 16:10:47 +00:00
Joe Groff
34dc94679d IRGen: Get objc protocol erasure working.
Don't try to emit witness tables for protocols that don't need them when emitting a protocol erasure. (We'll need to eventually ensure that ObjC method metadata gets generated for the conforming methods, but we don't yet, so this will only work for types that already have ObjC-dispatchable methods.)

Swift SVN r5610
2013-06-16 05:06:28 +00:00
Joe Groff
a491a3fc93 ClangImporter: Emit metadata for imported protocol types.
Swift SVN r5605
2013-06-16 02:55:47 +00:00
Joe Groff
61292d7993 IRGen: Leave ObjC protocols out of existential type layout.
ObjC protocols don't require witness tables and so don't need to be included in protocol existential container layout.

Swift SVN r5602
2013-06-15 22:29:43 +00:00
Joe Groff
101522bdfd Don't generate offensive words in our value witness mangling.
Swift SVN r5601
2013-06-15 22:12:50 +00:00
Joe Groff
54c6cb383f IRGen: Emit ObjC archetype/protocol method calls.
Emit ObjC method dispatch for ObjC method calls. This should get calls to generics bound by ObjC protocols working; ObjC existentials still need their representation tweaked not to include witness table pointers.

Swift SVN r5600
2013-06-15 22:12:46 +00:00
Joe Groff
24acecc0d3 IRGen: Fix uninitialized "needs metatype" flag in WitnessTableBuilder.
Move the initialization of NeedsExtraMetatype before an early exit from the constructor that I missed. Oops.

Swift SVN r5597
2013-06-15 17:40:46 +00:00
Joe Groff
d4f9579eac IRGen: Class-bounded generics don't need extra metatype data.
Since the type metadata for the underlying method will be taken from the class instance, the witness entry point for a class-bounded protocol conformance doesn't need to pass on an extra metatype parameter for the 'This' archetype.

Swift SVN r5595
2013-06-15 16:10:04 +00:00
Joe Groff
b1aff68da9 Allow [class_protocol] protocols to be [objc].
Swift SVN r5591
2013-06-15 00:41:32 +00:00
Joe Groff
f678700dce IRGen: Implement class-bounded existential containers.
Provide TypeInfo for class-bounded existentials, which represents them as an explosion comprising one witness table per subscribed protocol and then the class instance pointer as an ObjC-refcounted pointer. Provide lowerings for the SIL instructions that manipulate class-bounded existentials (except for existential-to-existential erasures, which aren't critical to getting basic operations working and will need some abstraction remapping to deal with class-bounded-to-opaque upcasts aside from the representation change).

Swift SVN r5579
2013-06-14 14:52:47 +00:00
Joe Groff
5c8c9f9fb1 IRGen: Tweak witness 'This' binding to allow class-bounded archetypes.
Handle the case of a 'this' parameter of 'This' type not being an LValueType or MetaTypeType, which happens for class-bounded protocols. This gets witness emission working for class-bounded archetypes.

Some abstraction remapping still needs to be implemented when non-class-bounded methods are accessed from a class-bounded archetype with a mix of class-bounded and non-class-bounded protocol constraints, to remap the class-bounded archetype to its opaque representation.

Swift SVN r5573
2013-06-11 16:40:08 +00:00
Joe Groff
00f9494d8f IRGen: Remove dead variable from getCallEmissionForLoweredValue.
As reported by Ted in <rdar://problem/14109803>.

Swift SVN r5571
2013-06-11 00:33:19 +00:00
Joe Groff
087803f5b0 IRGen: Implement type info for class-bounded archetypes.
Split ArchetypeTypeInfo into ClassBoundedArchetypeTypeInfo, for class-bounded archetypes, and OpaqueArchetypeTypeInfo, for fully generalized archetypes (the existing case). ClassBoundedArchetypeTypeInfo is represented using a single refcounted ObjCPointer. Implement abstraction remapping from class instances to class-bounded archetypes and back, and from class-bounded archetypes to non-class-bounded and back.

Witness tables are still generated only for opaque archetypes, so method calls on class-bounded archetypes won't work just yet.

Swift SVN r5569
2013-06-11 00:19:34 +00:00
Ted Kremenek
8876da8057 Remove essentially unused variable.
Swift SVN r5563
2013-06-11 00:11:18 +00:00
Doug Gregor
85f32c5c07 Prepend the magic "\01" to asm names of Clang declarations.
Should actually fix <rdar://problem/14094368> properly.


Swift SVN r5522
2013-06-07 21:26:10 +00:00
Doug Gregor
b4e68f1eaa Head Clang's AsmLabelAttr when mangling the name for the Clang declaration.
Fixes <rdar://problem/14094368>.


Swift SVN r5516
2013-06-07 20:08:27 +00:00
Joe Groff
b22fd22d57 SILGen: Handle Builtin.gep as a SIL builtin.
Add an index_raw_pointer instruction that acts like index_addr but for RawPointers, and use it to lower Builtin.gep into SIL instead of into IR.

Swift SVN r5479
2013-06-05 16:49:50 +00:00
Joe Groff
ed6b5ad497 SIL: Made index_addr index operand dynamic.
Instead of taking an integer constant index, index_addr now takes a value operand of builtin integer type, which makes more sense.

Swift SVN r5478
2013-06-05 16:49:41 +00:00
Joe Groff
3e3e5710ec Set proper DeclContext for ImplicitClosureExprs.
Now that SILGen and IRGen can both handle capturing archetypes from generic scopes, we can set the DeclContext of ImplicitClosureExprs correctly, so that SILGen captures their context archetypes. &&, and ||, and assert now work in generic contexts, at least in simple test cases.

Swift SVN r5476
2013-06-05 05:09:59 +00:00
Joe Groff
ae56951d08 IRGen: Emit specialized partial_apply thunks.
If a specialization is partially applied, emit a single thunk bundling the bound polymorphic arguments and the partially-applied argument values into a single context object. This should almost get closures in generic contexts (at least, ones that never cross abstraction boundaries) working.

Swift SVN r5475
2013-06-05 04:51:51 +00:00
Doug Gregor
109290c6f0 Introduce the StringLiteralConvertible formal protocol for string literals.
Swift SVN r5473
2013-06-04 21:35:12 +00:00
Joe Groff
0cb8adb46f SIL: Force all SILInstruction allocations through SILModule.
Delete the non-placement operator new/delete in the SILAllocated CRTP base so that the compiler saves us from accidentally allocating and leaking SILInstructions on the main heap instead of the owning SILModule's BPA.

Swift SVN r5468
2013-06-04 15:32:11 +00:00
Joe Groff
24c8e9b147 IRGen: Get correct type metadata address for empty tuple.
We were using _TMdT_ as a type metadata pointer, but it's really a full metadata symbol we need to offset to get the type metadata address.

Swift SVN r5376
2013-05-29 17:37:56 +00:00
Doug Gregor
db5ab01682 Allow ASTWalkers to replace statements and expressions without visiting their children first.
Swift SVN r5375
2013-05-29 17:16:33 +00:00
Joe Groff
66d4e683da Disable ObjC property thunks for function-type properties.
We can't autorelease a Swift function value to conform to the ObjC convention, we don't urgently need to expose function properties to ObjC, and the ultimate right thing to do is to convert between a Swift function value and an ObjC block value, so for now, we can just drop the property thunks.

Swift SVN r5373
2013-05-29 16:27:11 +00:00
Joe Groff
72e53052dc IRGen: Build method/property encodings based on bridged type.
This gives [objc] properties or property-ish methods of String type encodings as their NSString counterparts in the ObjC world.

Swift SVN r5365
2013-05-28 21:05:14 +00:00
Joe Groff
8693c5efaa SIL: Emit String-to-NSString conversions.
If -nsstring-is-string is enabled, lower Strings in cc(c) and cc(objc) function types to NSString, and when calling them, insert calls to StringToNSString/NSStringToString to perform the bridging conversion.

This isn't quite ready for prime-time yet, because we still need to emit the inverse bridging for ObjC method thunks, and I haven't tested the IRGen end of things yet.

Swift SVN r5355
2013-05-26 20:29:09 +00:00
Joe Groff
0dc5c66cd2 SIL: Move SILFunctionTypeInfo into a side table.
Generate and cache SILFunctionTypeInfo from Swift types on the fly, and simplify the SILType representation down to a CanType and isAddress bit.

Swift SVN r5298
2013-05-24 16:33:52 +00:00
Joe Groff
e3269a3b95 Pick one name for 'getAbstractCC'.
getCC, getFunctionCC, getConvention...consolidate them all under one name.

Swift SVN r5297
2013-05-24 03:08:40 +00:00
Joe Groff
5e2779b51e SIL: Uncurry function types within the Swift type system.
Remove uncurry level as a property of SILType/SILFunctionTypeInfo. During SIL type lowering, map a (Type, UncurryLevel) pair to a Swift CanType with the uncurried arguments as a Swift tuple. For example, T -> (U, V) -> W at uncurry level 1 becomes ((U, V), T) -> W--in reverse order to match the low-level calling convention. Update SILGen and IRGen all over the place for this representation change.

SILFunctionTypeInfo is still used in the SILType representation, but it's no longer load-bearing. Everything remaining in it can be derived from a Swift type.

This is an ABI break. Be sure to rebuild clean!

Swift SVN r5296
2013-05-24 01:51:07 +00:00
Doug Gregor
b2bd4d49b0 Make IRGen and the runtime agree on the name swift_getFunctionTypeMetadata.
Fixes <rdar://problem/13942390>.


Swift SVN r5253
2013-05-21 16:21:40 +00:00
Joe Groff
826835efba Kill outdated fixme.
No semantic change.

Swift SVN r5252
2013-05-21 15:21:11 +00:00
Joe Groff
8993ed707e Split 'C' and 'ObjCMethod' calling conventions.
This cleans up some wishy-washy control flow that relied on the uncurryLevel of a type to distinguish ObjC methods from freestanding C functions. While we're here, clean up all the places we use ad-hoc comparison logic on the AbstractCC enum to use switches that properly cover the enum.

Swift SVN r5251
2013-05-21 15:19:37 +00:00
Joe Groff
fcd7b06eb5 IRGen: Disregard uncurry level of property accessors when mangling.
We mangle the type of the property, not the type of the accessor, so the uncurry level of the accessor is irrelevant to the mangler and causes the mangler to mangle properties of function type incorrectly--'var x : () -> ()', for instance, gets mangled to '_T6module1xfT_T_g' (with a lowercase uncurried 'f') instead of the proper '_T6module1xFT_T_g'. This broke the ListMaker test because SILGen and IRGen were coming up with inconsistent manglings for the 'handler' property of UndoManager in NSUndoManagerExts. Fixes <rdar://problem/13926113>.

Swift SVN r5229
2013-05-20 19:11:16 +00:00