(Reflecting some off thread discussion)
XCOFF defaults to HIDDEN visibility and requires an explicit export file to behave like ELF DEFAULT visibility.
XCOFF defaults to no/unspecified visibility, since visibility is optional for AIX assembly and XCOFF objects can have no setting for the visibility bits. While default is superficially similar to hidden, hidden is an explicit symbol visibility and seems it can be propagated through static links.
What is the additional functionality provided by EXPORT versus the existing levels? It seems that XCOFF wants DEFAULT to mean HIDDEN to match its semantics and wants an additional level to provide the semantics of DEFAULT visibility for XCOFF.
For XCOFF, we match the IR “default” to unspecified / no visibility which means not emitting any visibility attributes in the MC layer. Whether the symbol is then exported from the shared object then depends on the user supplied export list and flags provided to the linker.
As stated above, there are some semantic differences between a XCOFF symbol with hidden and unspecified visibility, so it seems desirable to continue to make them distinct in the IR.
This also conflicts with all other toolchains that have implemented visibility attributes.
This proposal explicitly leaves the front-end implementation intentionally unspecified. The frontend is will be free to map the source level visibility attributes in different ways under option control to maintain compatibility with the variance in the toolchain implementations (e.g. GCC and XL) on AIX, which is (presumably) what will be done in clang.