Generalize D99629 for ELF. A default visibility non-local symbol is preemptible
in a -shared link. isInterposable is an insufficient condition.
Moreover, a non-preemptible alias may be referenced in a sub constant expression
which intends to lower to a PC-relative relocation. Replacing the alias with a
preemptible aliasee may introduce a linker error.
Respect dso_preemptable and suppress optimization to fix the abose issues. With
the change, alias = 345 will not be rewritten to use aliasee in a -fpic
compile.
int aliasee; extern int alias __attribute__((alias("aliasee"), visibility("hidden"))); void foo() { alias = 345; } // intended to access the local copy
While here, refine the condition for the alias as well.
For some binary formats like COFF, isInterposable is a sufficient condition.
But I think canonicalization for the changed case has little advantage, so I
don't bother to add the Triple(M.getTargetTriple()).isOSBinFormatELF() or
getPICLevel/getPIELevel complexity.
For instrumentations, it's recommended not to create aliases that refer to
globals that have a weak linkage or is preemptible. However, the following is
supported and the IR needs to handle such cases.
int aliasee __attribute__((weak)); extern int alias __attribute__((alias("aliasee")));
There are other places where GlobalAlias isInterposable usage may need to be
fixed.
nit: this captures nothing, right? You can drop the &.