Those can work. The equivalent to today's @inlinable would then be @export(interface, implementation), I presume?
@Joe_Groff had separately pointed out that we already have a spelling for "exported out of the module": public. We could view this as being related to access control, e.g., public(interface) and public(implementation). We might just be trading one misleading association (inlining) with another (access control).
It's more than ABI, though, and people use @inlinable (one of the things subsumed here) as a performance optimization. Overloading @abi seems like another almost-equivalence that we might regret.
public doesn't necessarily mean that it's linkable externally, only that Swift code in another module can call it.
I would hope that improvements to the build system [*] here would mean that the vast majority of Swift developers never need to think about these attributes, because Swift just does the right thing: expose implementations for performance when it's safe, hide them for incremental build performance, whatever. Even an excellent system is likely to make the wrong choice for some users some of the time. Having language-level controls available for users to express what they need is important for those cases.
Doug
[*] It's not just one build system, it's every build system. I deal with SwiftPM, swift-build, CMake, and Makefile-based Swift projects on a daily basis.