Commit Graph

1024 Commits

Author SHA1 Message Date
Joe Groff
96d52d3bdf IRGen: Make 'ConformanceInfo' a class hierarchy.
Split out the old path, where we directly referenced internal constants, from the new one, where we define global symbols, and may need to replaceAllUsesWith a definition when we visit one, so a direct reference to the llvm::Constant* is not robust.

Swift SVN r11612
2013-12-24 00:28:41 +00:00
Joe Groff
3381ae8529 IRGen: Ignore 'var' requirements for now in the WitnessBuilder.
I thought we already ignored these, but it turns out we just never actually instantiated witness tables for the stdlib protocols that declare property requirements. When we eagerly generate witness tables this crashed. Ignore them at the IRGen level for now, so we don't need to regress the stdlib.

Swift SVN r11611
2013-12-24 00:28:39 +00:00
Joe Groff
1690f5265c IRGen: Emit witness tables as exported symbols in -emit-sil-protocol-witness-tables mode.
SILGen eagerly produces witness tables for all of the conformances defined in the module, which is what we want in order to make them runtime-unique. Have IRGen follow suit. This should address a ton of radars about breakage with non-unique conformances once SIL witnesses are turned on. We will need some runtime machinery to handle witness tables with dependent fields, but since we currently ignore the associated type fields of witnesses, we can get away with emitting direct references to all witness tables for now.

Swift SVN r11608
2013-12-23 20:31:49 +00:00
Joe Groff
ee71669a52 IRGen: Handle @objc protocols in the -emit-sil-protocol-witness-tables regime.
These still can't ever take any extra polymorphic params without breaking the calling convention, so protocol_method still needs to produce a thin value in SIL, and we have to ensure we don't add any extra polymorphic params in the IR signature.

Swift SVN r11594
2013-12-23 03:57:38 +00:00
Joe Groff
07a6fd7e21 IRGen: Don't produce polymorphic witness table arguments for @objc protocols.
They don't need them.

Swift SVN r11593
2013-12-23 03:57:36 +00:00
Joe Groff
8c7659451d IRGen: Populate witness tables using SILWitnessTables.
In -emit-sil-protocol-witness-tables mode, bypass IRGen's thunk generation and consult the SILWitnessTable for the functions to use as witnesses. To minimize the shock to the system, we still produce the witness tables themselves using the broken old lazy generation system; we only use the SILWitnessTable to feed it witnesses.

Swift SVN r11577
2013-12-22 22:37:57 +00:00
Joe Groff
2f66cfed70 IRGen: Lower protocol_method in -emit-sil-protocol-witness-tables mode.
We still abuse the 'ExtraData' concept to carry the existential self type metadata from the protocol_method to the application, so we let that argument come from ExtraData when expanding the signature and consume it when binding arguments.

Swift SVN r11565
2013-12-22 04:44:41 +00:00
Joe Groff
548ea3ae3d IRGen: Lower archetype_method calls in -emit-sil-protocol-witness-methods mode.
archetype_method results no longer need to be thick; we can get the Self binding from the substitution in the apply instruction. When considering the 'self' argument of a witness_method, consider an archetype self type as fulfilling itself; we'll inject the metadata for it when we emit the polymorphic source.

Swift SVN r11564
2013-12-22 04:11:07 +00:00
Joe Groff
bd0690be5c IRGen: Unwrap metatype of static method when considering the Self type for a polymorphic convention.
We use the substInputType to create an artificial polymorphic parameter from whole cloth for witnesses, and we don't want to pass the metadata for the metatype.

Swift SVN r11558
2013-12-21 21:56:20 +00:00
Joe Groff
a2f86c42a3 IRGen: Fix bad fallthrough in lowering witness polymorphic source.
Swift SVN r11540
2013-12-21 16:15:07 +00:00
Mark Lacey
9b81800432 Choose correct IR types for @objc return values.
This change updates signature generation as well as IR generation for
calls and returns so that the correct ABI types are generated for the
results of @objc functions.

Swift SVN r11527
2013-12-20 23:31:01 +00:00
Chris Lattner
b29748a6be remove the ASTContext argument from Type::transform,
(various) FunctionType::get's, ArrayType::get,
ArraySliceType::get, OptionalType::get, and a few
other places.

There is more to be done here, but this is all I plan to do
for now.


Swift SVN r11497
2013-12-20 02:23:21 +00:00
Joe Groff
017440165e Fix the weird capitalization of MetaTypeType.
Swift SVN r11475
2013-12-19 18:43:08 +00:00
Joe Groff
f9a5b2cf25 IRGen: Lower the witness polymorphic convention.
Add a new SourceKind for PolymorphicConvention, 'WitnessSelf', which always introduces a final 'Self' metadata argument to the signature and uses it to fulfill all of the generic parameters of the Self type, regardless of the SIL-level polymorphic signature of the function.

Swift SVN r11467
2013-12-19 06:48:08 +00:00
Connor Wakamo
3e81830385 Move "include/swift/IRGen/Options.h" to "include/swift/AST/IRGenOptions.h".
This commit only moves the header file; updating the class so that it is no longer in the irgen namespace will be handled separately.

Swift SVN r11404
2013-12-18 01:17:09 +00:00
Doug Gregor
2d75ca2adf Add a LazyResolver to ProtocolConformance::getWitness().
Swift SVN r11331
2013-12-15 19:40:49 +00:00
Joe Groff
9d2f5719dc IRGen: Factor logic to look up witness tables out of forEachProtocolWitnessTable loop.
This lets us share implementation with emitArchetypeMethodValue and easily generalize emitArchetypeMethodValue to work with concrete types.

Swift SVN r10941
2013-12-06 21:56:33 +00:00
John McCall
4bba9b38f8 Make several new interfaces traffic in AbstractionPatterns.
Swift SVN r10621
2013-11-21 02:19:46 +00:00
Adrian Prantl
a3960c4299 silentium!
Swift SVN r10617
2013-11-21 00:50:52 +00:00
John McCall
20e58dcf93 Change the type of function values in SIL to SILFunctionType.
Perform major abstraction remappings in SILGen.  Introduce
thunking functions as necessary to map between abstraction
patterns.

Swift SVN r10562
2013-11-19 22:55:09 +00:00
Joe Groff
d188fd5c0a IRGen: Handle class-existential-to-opaque-archetype cast.
Handle an indirect cast from a class existential, so we can cast class existentials to opaque archetype types. Fixes <rdar://problem/15313840>.

Swift SVN r10545
2013-11-18 19:26:51 +00:00
Adrian Prantl
2abe03fda0 Debug Info: Emit a shadow copy of the type metadata in an alloca at -O0
so we can emit persistent debug info for it.
Fixes <rdar://problem/15428758> dbg.value doesn't make it into the .o file.

Swift SVN r10354
2013-11-12 01:24:12 +00:00
Joe Groff
7de9706403 IRGen/Runtime: Expose extra inhabitants of class protocol types.
This gives 'id?' and other optional class protocol types optimal representation consistent with class types.

Swift SVN r10346
2013-11-11 22:52:23 +00:00
John McCall
93dfaa6bf4 Make everything getting a TypeInfo declare whether it's
working with a SIL-lowered or SIL-unlowered type.

Swift SVN r10067
2013-11-09 01:41:16 +00:00
Joe Groff
554abf2d7a IRGen/Runtime: Expose extra inhabitants of class types.
Start using null-page values as extra inhabitants when laying out single-payload enums that contain class pointers as their payload type. Don't use inhabitants that set the lowest bit, to avoid trampling potential ObjC tagged pointer representations. This means that 'T?' for class type T now has a null pointer representation. Enums with multiple empty cases, as well as nested enums like 'T??', should now have optimal representations for class type T as well.

Note that we don't yet expose extra inhabitants for aggregates that contain heap object references, such as structs with class fields, Swift function types, or class-bounded existentials (even when the existential has no witness tables).

Swift SVN r10061
2013-11-09 00:43:40 +00:00
Joe Groff
51f615687c IRGen: Don't assert out when a generic class conforms to a protocol.
Fixes <rdar://problem/15420374>.

Swift SVN r10040
2013-11-08 17:36:59 +00:00
Doug Gregor
0107e36e8b Allow models to omit witnesses for optional protocol requirements.
Swift SVN r9962
2013-11-05 16:28:34 +00:00
Joe Groff
72594e0bc1 IRGen: Remove dead code for producing existential 'typeOf' value witnesses.
Existential value witnesses come from the runtime now.

Swift SVN r9877
2013-11-01 20:21:37 +00:00
Adrian Prantl
459db73092 Debug info: Move the logic for emitting type metadata arguments to
GenProto, and emit both the mangled name and the type variable used by the
programmer for archetypes.
Fixes <rdar://problem/15346134> The $swift.type metadata arguments do not show up anymore

Swift SVN r9844
2013-10-31 04:50:33 +00:00
Jordan Rose
766f41f266 Put top-level decls in the SourceFile DeclContext, rather than in the TU.
Swift SVN r9647
2013-10-24 18:59:24 +00:00
Joe Groff
97eb75294d IRGen: Make getFixedPacking a public interface of TypeInfo.
This is useful for LLDB to determine, given a known fixed-size type, whether values of that type pack inline into fixed-size buffers without having to grovel the VWT in the process memory.

Swift SVN r9632
2013-10-23 23:27:09 +00:00
Joe Groff
3d60786a30 IRGen: Add a requiresProtocolWitnessTable fn instead of peppering isObjC() everywhere.
Swift SVN r9497
2013-10-18 21:49:06 +00:00
Joe Groff
f164a88615 IRGen: Emit ObjC protocol records for protocols used in casts.
Greg indicated that objc_getProtocol only works if somebody actually reifies a protocol_t record for the protocol with the runtime, so we need to emit our own protocol_t for every Protocol* value we do a checked cast with. Hijack the ClassDataBuilder to also build protocol_t records.

Swift SVN r9420
2013-10-16 21:50:56 +00:00
Joe Groff
16e66e6f96 IRGen: Swallow the 'Proto' suffix the Clang import tags onto ObjC protocols.
Swift SVN r9400
2013-10-16 01:46:11 +00:00
Joe Groff
d273b799e3 IRGen: Emit downcasts to ObjC protocol types.
Use objc_getProtocol to derive a reference to the Protocol* for each required conformance, then pass the array off to a to-be-written dynamicCastObjCProtocol(Un)?Conditional entry point that will do all of the conformsToProtocol checks.

Swift SVN r9397
2013-10-16 01:28:59 +00:00
Joe Groff
f5d64a3dac IRGen: Handle concrete-to-archetype casts.
The existing emitOpaqueDowncast runtime function is general enough to handle this; just let down some unnecessary assert guards.

Swift SVN r9394
2013-10-16 00:28:32 +00:00
Joe Groff
fe37b82a0b IRGen: Rename TypeInfo::initializeValueWitnessTable to initializeMetadata.
Its job will be a bit more broad for generic structs, where it needs to fill field offsets into the metadata in addition to storing the final size, stride, and alignment information to the value witness table.

Swift SVN r9104
2013-10-09 22:40:28 +00:00
John McCall
a38abec9fe Introduce (but don't yet use) SILFunctionType.
Swift SVN r9088
2013-10-09 20:55:42 +00:00
Doug Gregor
a012f60633 Make protocol methods generic over <Self>.
Pull the implicit 'Self' associated type out of the protocol and into
an implicitly-declared generic parameter list for the protocol. This
makes all of the methods of a protocol polymorphic, e.g., given

  protocol P {
    typealias Assoc
    func getAssoc() -> Assoc
  }

the type of P.getAssoc is:

  <Self : P> (self : @inout P) -> () -> Self.Assoc

This directly expresses the notion that protocol methods are
polymorphic, even though 'Self' is always implicitly bound. It can be
used to simplify IRgen and some parts of the type checker, as well as
laying more of the groundwork for default definitions within
protocols as well as sundry other improvements to the generics
system.

There are a number of moving parts that needed to be updated in tandem
for this. In no particular order:
  - Protocols always get an implicit generic parameter list, with a
  single generic parameter 'Self' that conforms to the protocol itself.
  - The 'Self' archetype type now knows which protocol it is
  associated with (since we can no longer point it at the Self
  associated type declaration).
  - Protocol methods now get interface types (i.e., canonicalizable
  dependent function types).
  - The "all archetypes" list for a polymorphic function type does not
  include the Self archetype nor its nested types, because they are
  handled implicitly. This avoids the need to rework IRGen's handling
  of archetypes for now.
  - When (de-)serializing a XREF for a function type that has an
  interface type, use the canonicalized interface type, which can be
  meaningfully compared during deserialization (unlike the
  PolymorphicFunctionType we'd otherwise be dealing with).
  - Added a SIL-specific type attribute @sil_self, which extracts the
  'Self' archetype of a protocol, because we can no longer refer to
  the associated type "P.Self". 




Swift SVN r9066
2013-10-09 17:27:58 +00:00
Greg Parker
be12f30395 Move MaxScalarsForDirectResult to SwiftTargetInfo.
Swift SVN r8935
2013-10-04 22:11:46 +00:00
Joe Groff
5d8a7ff9e7 Allow multiple comma-separated enum elements in a 'case' decl.
Introduce an EnumCaseDecl for source fidelity to track the 'case' location and ordering of EnumElementDecls. Parse a comma-separated list of EnumElementDecls after a 'case' token.

Swift SVN r8509
2013-09-20 19:51:13 +00:00
Joe Groff
e109124186 Replace 'union' keyword with 'enum'.
This only touches the compiler and tests. Doc updates to follow.

Swift SVN r8478
2013-09-20 01:33:14 +00:00
Joe Groff
c10340433c IRGen: Forward extra inhabitants through single-payload unions.
If a single-payload union doesn't use up all of its payload's extra inhabitants, it can claim the remaining ones as its own. While we're here, specialize the extra inhabitants implementation for no-payload unions to generously (and more efficiently) give out all integer values within its storage type above the largest discriminator as extra inhabitants, instead of relying entirely on the spare bits mask.

Swift SVN r8470
2013-09-19 23:16:53 +00:00
Joe Groff
7760c23039 IRGen: Plumb bound generic parameters and nominal parents for NecessaryBindings.
Save archetype bindings from bound generic and nominal type parameters so that we can properly put generic value types inside arrays, protocol containers, etc.

Swift SVN r8367
2013-09-17 23:50:34 +00:00
Adrian Prantl
64881bdf7a silence warnings
Swift SVN r8227
2013-09-13 23:31:14 +00:00
Doug Gregor
978eaab5c6 Introduce lazy computation of a BoundGenericType's substitutions.
Teach a BoundGenericType to compute its own substitutions, which
allows AST clients to create new bound generic types without the aid
of the type checker. 

This eliminates the TypeChecker::validateTypeSimple() abomination as
well as the need for the BoundGenericType AST validation step. There
is still more cleanup to do in this area.

Note that BoundGenericType::getSubstitutions() now accepts a module
parameter, which is the place from which we will look for
conformances. This is a baby step toward properly modeling the
conformances as part of the bound generic type, and is nowhere near
complete.


Swift SVN r8193
2013-09-13 14:25:36 +00:00
Joe Groff
d175076b2c IRGen: Add initializeValueWitnessTable to TypeInfo.
For dynamic generic types, this emits the sequence of operations to turn a value witness table template into a full, valid value witness table. For now, leave it stubbed out as empty, except for dynamic singleton unions, where we copy the size, flags, and stride from the lone element's table.

Swift SVN r8014
2013-09-06 23:53:17 +00:00
Joe Groff
e0998b7a1c IRGen: Emit extra inhabitant value witness table entries.
If a type may have extra inhabitants, include the extra inhabitant witnesses in its value witness table.

Swift SVN r7973
2013-09-06 00:41:23 +00:00
Joe Groff
ea61572b41 IRGen: Tail-emplace dependent vwtables into generic metadata patterns.
If a generic type has dynamic layout, the value witness table for its instances is dependent on its generic parameters for size and alignment. Instead of emitting a global symbol for the vwtable in these circumstances, embed the value witness table template in the generic metadata template so that both get instantiated in tandem by the runtime when the generic instance metadata is requested.

Swift SVN r7931
2013-09-05 00:33:38 +00:00
Joe Groff
52283c01f2 IRGen: Bind archetype metadata for generic value witnesses.
Use EmitPolymorphicParameters to extract the metadata for generic type parameters from the "self" argument to value witnesses so that they're available to the value witness implementation. This makes it so that the compiler no longer crashes when emitting the value witness table for a generic struct with dynamic size.

This temporarily breaks generic unions since we didn't properly implement generic argument lookup for union metadata yet. Fix coming shortly.

Swift SVN r7910
2013-09-04 21:18:16 +00:00