Commit Graph

217 Commits

Author SHA1 Message Date
Joe Groff
df583fa308 IRGen: Fix logic inversion in extra inhabitant calculation for heap references.
'max' isn't 'min'. Oops. Fixes <rdar://problem/15679353>.

Swift SVN r11431
2013-12-18 19:25:26 +00:00
Joe Groff
02a0e996c4 SIL: Kill initialize_var instruction.
Remove the initialize_var instruction now that DI fully diagnoses initialization problems. Change String-to-NSString bridging to explicitly invoke String's default constructor; it was the last remaining user of initialize_var. Remove dead code to emit an implicit default constructor without a body.

Swift SVN r11066
2013-12-10 03:36:59 +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
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
Joe Groff
b8cb9ae336 Add IRGen test for multi-payload enum with class references in payloads.
Swift SVN r10330
2013-11-11 17:54:45 +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
9b3ca11639 IRGen: Fix leak when destroying dependent generic single-payload enum.
The payload type of a dependent single-payload enum is "empty" but we still need to run its destructor. Oops. Fixes <rdar://problem/15383966>.

Swift SVN r9932
2013-11-04 22:31:10 +00:00
Joe Groff
e31a1cf0a3 IRGen: Nominal type descriptors can be constant.
Swift SVN r9658
2013-10-24 21:52:03 +00:00
Joe Groff
6676690ad2 IRGen: Handle single-payload enums with empty payload.
This arises when a generic single-payload type is instantiated on an empty type, such as '()?'.

Swift SVN r9609
2013-10-23 00:41:44 +00:00
Joe Groff
b8c75769b3 IRGen: Emit nominal type descriptors in struct and enum metadata.
Build a nominal type descriptor when we emit the metadata or generic metadata pattern for a nominal type, and put a reference into the formerly null slot in the struct or enum metadata. We need to make a place for them in class metadata; that'll come next.

Swift SVN r9492
2013-10-18 21:04:58 +00:00
Chris Lattner
a476f65471 Abolish the old attribute syntax for type attributes (and SIL type attrs)
- Change type attribute printing logic (in astprinter and the demangler) 
  to print in the new syntax
- Change the swift parser to only accept type attributes in the new syntax.
- Update canParseTypeTupleBody to lookahead over new-syntax type attributes.
- Update the testsuite to use the new syntax.



Swift SVN r9273
2013-10-13 05:39:46 +00:00
Joe Groff
14edefae8c Update order of operations in test/IRGen/enum.sil.
Swift SVN r9234
2013-10-11 23:31:51 +00:00
Joe Groff
99a0c64b5a IRGen: More robustly lay out enums with payloads.
John noted that LLVM's ABI rules for Integers of Unusual Size cause them to be aligned like the largest native integer type even inside packed structs, making them unsuited for byte-accurate layout in cases where the payload is a non-power-of-two size, so we have to bite the bullet and lay them out as arrays of i8, bitcasting to the payload type to load and store the payload and tag parts.

This still colors outside of the lines a bit because loading or storing e.g. an i72 is going to touch an i128's worth of memory. Baby steps. It'd be nice to be able to load and reconsistute the i72 without having to load and mask together all of the individual bytes.

Swift SVN r9058
2013-10-09 05:07:51 +00:00
Joe Groff
2ac198d16b IRGen: Use packed structs to accurately lay out aggregate types.
LLVM's normal data layout doesn't jive with our own StructLayout's more aggressive use of padding space, and causes problems such as <rdar://problem/14336903>. Because we do our own alignment and stride management, we can safely use LLVM packed struct types with manual padding to get the level of control we need to accurately reflect our desired struct layout.

Swift SVN r9056
2013-10-09 04:12:46 +00:00
Joe Groff
3eb220da26 IRGen: Fix layout bug with payloaded enums.
If the enum gets laid out with a non-power-of-two payload and an extra tag, such as { i72, i2 }, then LLVM's natural location for the extra tag is going to be different from where we actually want it, so let's do our own byte offset calculation by bitcasting to i8* and gepping instead of trying to gep the struct directly.

Swift SVN r9023
2013-10-08 04:34:42 +00:00
Joe Groff
ae00d91bb1 IRGen: Remove needless empty enum assertion.
Swift SVN r8774
2013-09-30 15:22:52 +00:00
Joe Groff
6740964db8 Rename IRGen 'union' tests to 'enum' tests.
Swift SVN r8773
2013-09-30 15:22:44 +00:00