[cfe-dev] [llvm-dev] RFC: A new ABI for virtual calls, and a change to the virtual call representation in the IR

John McCall via cfe-dev cfe-dev at lists.llvm.org
Fri Mar 11 11:58:31 PST 2016

> On Mar 11, 2016, at 11:26 AM, Rafael Espíndola <rafael.espindola at gmail.com> wrote:
>> Now, there are a number of things about linkage that are kindof orthogonal,
>> and it would be nice to model them more orthogonally.  That would be a major
>> change in representation, though.  Absent the will to do that, I propose
>> that we:
>>  - remove/deprecate protected visibility, making visibility purely a hidden
>> vs. non-hidden flag
> This would prevent us from propagating
> __attribute__((visibility("protected")) to a STV_PROTECTED in the .o,
> so I don't think we should do it.

The whole point of this proposal is to get us to a state where we can use
STV_PROTECTED for ordinary external or weak_for_linker symbols.

__attribute__((visibility(“protected”))) on a strong definition would just map
to ordinary non-hidden external linkage, which the backend would turn into

__attribute__((visibility(“default”))) on a strong definition would map the
same way unless -fsemantic-interposition was enabled.

The point of removing protected visibility is that we don’t actually honor
default visibility in the ELF sense, so it’s silly to pretend that LLVM
visibility is the same as ELF visibility.  ELF protected visibility is basically
the semantics LLVM already assigns to default visibility.

>>  - add weak_for_linker, weak_odr_for_linker, linkonce_for_linker, and
>> linkonce_odr_for_linker (better names highly desired) to model the
>> weak-with-protected-visibility cases
>>  - add strong_for_linker (better name highly desired) to model the
>> strong-but-interposable case
> For representing interposition we would only need one extra linkage
> type: interposable (runtime_weak?).

The other linkages are an attempt to preserve the ability to use STV_PROTECTED
on weak definitions while eliminating protected visibility from LLVM.

> We could split the linkage into multiple orthogonal bits, like: odr, weak_for_linker,
> weak_for_runtime, can_be_dropped_if_unused, etc, but I think that is
> an independent cleanup

I agree that that would be best done independently.


More information about the cfe-dev mailing list