Commit Graph

31 Commits

Author SHA1 Message Date
Slava Pestov
22ad20a5df TBDGen: Emit class method dispatch thunks 2017-12-18 23:28:33 -08:00
Huon Wilson
a560ea15f1 [TBDGen] Include all transparent symbols.
This is a vast overestimate, but is better than missing some.

rdar://problem/32254773
2017-06-30 11:17:51 -07:00
Huon Wilson
fed23ed40d [TBDGen] Include both direct and indirect field offsets.
It is semantically incorrect to miss a symbol, and just misleading to
include an incorrect one in the TBD file (and, it would take a compiler
bug to actually try to reference one from some downstream code), so it
is better to err on the side of including extra symbols than missing
some.

For now, computing the actual directness of a field is difficult, so
let's include both of them.

Fixes rdar://problem/32253411 .
2017-06-19 14:53:21 -07:00
Robert Widmann
71bf312a25 Migrate the rest of the tests to %empty-directory 2017-06-04 11:08:39 -07:00
Huon Wilson
40ba18615b [Frontend] -validate-tbd-against-ir has 3 levels of validation.
It can now:

- not validate (=none)
- validate that all symbols in the IR are also in the TBD (=missing),
- validate the above, and also that all in the TBD are in the IR (=all).

The first and last were switched between with the old boolean flag, the
second is new.
2017-05-19 18:36:48 -07:00
Huon Wilson
6b9260582b [test/TBD] Avoid writing to source directory. 2017-04-18 11:33:54 -07:00
Huon Wilson
d40b8fa5e2 [TBDGen] Conformances in extensions. 2017-04-18 11:14:19 -07:00
Huon Wilson
704d4ed631 [test/TBD] Input -> Inputs. Whoops. 2017-04-18 10:45:26 -07:00
Huon Wilson
78dcc1be28 [TBDGen] ObjC classes don't have public destructors. 2017-04-17 17:15:16 -07:00
Huon Wilson
dbc9d8eaaa [TBDGen] main is a symbol. 2017-04-14 17:16:58 -07:00
Huon Wilson
7bedb6fdd5 [TBDGen] Generic types have fewer symbols. 2017-04-14 17:06:53 -07:00
Huon Wilson
e5acdd42fc [TBDGen] Handle private/internal methods on open classes. 2017-04-14 10:13:11 -07:00
Huon Wilson
c41319b24b [SIL] Only open classes can be subclassed externally. 2017-04-14 10:13:11 -07:00
Huon Wilson
04aa385f27 [TBDGen] Non-allocating class constructor/destructor. 2017-04-13 11:42:54 -07:00
Huon Wilson
fce992ff8b [TBDGen] Class direct field offsets. 2017-04-13 11:41:29 -07:00
Huon Wilson
6cccddf39a [TBDGen] Class metaclasses, when interacting with ObjC. 2017-04-13 11:40:50 -07:00
Huon Wilson
520f186c4f [TBDGen] Class witness table offsets. 2017-04-13 11:39:50 -07:00
Huon Wilson
2446db55ed [TBDGen] Stored property initializers. 2017-04-13 11:38:58 -07:00
Huon Wilson
53d80be1e3 [TBDGen] Transparent symbols don't exist. 2017-04-13 11:36:50 -07:00
Erik Eckstein
789646a15b Demangling: Make demangled names more readable and further reduce the size of the simplified demangled names
The goal here is to make the short demangling as short and readable as possible, also at the cost of omitting some information.
The assumption is that whenever the short demangling is displayed, there is a way for the user to also get the full demangled name if needed.

*) omit <where ...> because it does not give useful information anyway

Deserializer.deserialize<A where ...> () throws -> [A]
--> Deserializer.deserialize<A> () throws -> [A]

*) for multiple specialized functions only emit a single “specialized”

specialized specialized Constructible.create(A.Element) -> Constructible<A>
--> specialized Constructible.create(A.Element) -> Constructible<A>

*) Don’t print function argument types:

foo(Int, Double, named: Int)
--> foo(_:_:named:)

This is a trade-off, because it can lead to ambiguity if there are overloads with different types.

*) make contexts of closures, local functions, etc. more readable by using “<a> in <b>” syntax
This is also done for the full and not only for the simplified demangling.

Renderer.(renderInlines([Inline]) -> String).(closure #1)
--> closure #1 in Renderer.renderInlines

*) change spacing, so that it matches our coding style:

foo <A> (x : A)
--> foo<A>(x: A)
2017-04-13 08:43:28 -07:00
Huon Wilson
088824de2b [TBDGen] Generate symbols for protocol conformances. 2017-04-06 17:51:04 -07:00
Slava Pestov
6a83e7303e SILGen: Protocol witness thunks don't need public linkage
We used to give witness thunks public linkage if the
conforming type and the protocol are public.

This is completely unnecessary. If the conformance is
fragile, the thunk should be [shared] [serialized],
allowing the thunk to be serialized into callers after
devirtualization.

Otherwise for private protocols or resilient modules,
witness thunks can just always be private.

This should reduce the size of compiled binaries.

There are two other mildly interesting consequences:

1) In the bridged cast tests, we now inline the witness
   thunks from the bridgeable conformances, which removes
   one level of indirection.

2) This uncovered a flaw in our accessibility checking
   model. Usually, we reject a witness that is less
   visible than the protocol; however, we fail to
   reject it in the case that it comes from an
   extension.

   This is because members of an extension can be
   declared 'public' even if the extended type is not
   public, and it appears that in this case the 'public'
   keyword has no effect.

   I would prefer it if a) 'public' generated a warning
   here, and b) the conformance also generated a warning.

   In Swift 4 mode, we could then make this kind of
   sillyness into an error. But for now, live with the
   broken behavior, and add a test to exercise it to ensure
   we don't crash.

   There are other places where this "allow public but
   ignore it, kinda, except respect it in some places"
   behavior causes problems. I don't know if it was intentional
   or just emergent behavior from general messiness in Sema.

3) In the TBD code, there is one less 'failure' because now
   that witness thunks are no longer public, TBDGen does not
   need to reason about them (except for the case #2 above,
   which will probably require a similar workaround in TBDGen
   as what I put into SILGen).
2017-03-30 03:52:57 -07:00
Huon Wilson
53807e4641 [test/TBD] Only test classes with objc_interop.
The list of missing symbols is different on linux, without objc support,
meaning the diff-based testing fails. This is only a problem when we
have do this diffing, so just conditionalise it for now.
2017-03-29 09:44:38 -07:00
Huon Wilson
0c37685327 [TBD] Validate against truly externally visible symbols in the IR.
External linkage isn't enough: not being hidden is important too.
2017-03-28 16:31:12 -07:00
Huon Wilson
91bf6771ca [test/TBD] add tests that really use private-access. 2017-03-28 16:31:12 -07:00
Huon Wilson
d7a8b8382f [test/TBD] use "internal" instead of "private". 2017-03-28 16:31:11 -07:00
Huon Wilson
83f6e319f9 [TBD] let special casing actually applies to static/global lets and vars. 2017-03-28 16:31:11 -07:00
Huon Wilson
636a3c5821 [TBD] Sort -emit-tbd, and -validate-tbd-against-ir errors.
Also, diff the full output rather than using FileCheck.
2017-03-28 16:31:10 -07:00
Huon Wilson
dab44b3cc6 [TBDGen] Private class decls have public type information. 2017-03-28 16:31:10 -07:00
Huon Wilson
121067a8ce [TBDGen] let: accessors and variable itself. 2017-03-28 16:31:10 -07:00
Huon Wilson
6f822ac3e3 [test] Add TBD tests using -validate-tbd-against-ir.
Only one of these tests actually "passes", since TBDGen is incomplete,
but the use of FileCheck means they'll be flagged to be updated as
TBDGen improves: the failures are known problems.
2017-03-28 16:31:09 -07:00