diff options
author | Fangrui Song <i@maskray.me> | 2021-07-20 13:22:00 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2021-07-20 13:22:00 -0700 |
commit | db5e0786900e53843f87c4169c404f8c7831eb8c (patch) | |
tree | 35da5fa3a9c42965f2504fdae276b09481ead698 /llvm/lib/Object/IRSymtab.cpp | |
parent | ce8024e8ff76e7be8b9ffa1a39d1dc9310bf74c7 (diff) | |
download | llvm-db5e0786900e53843f87c4169c404f8c7831eb8c.zip llvm-db5e0786900e53843f87c4169c404f8c7831eb8c.tar.gz llvm-db5e0786900e53843f87c4169c404f8c7831eb8c.tar.bz2 |
[LTO] Add SelectionKind to IRSymtab and use it in ld.lld/LLVMgold
In PGO, a C++ external linkage function `foo` has a private counter
`__profc_foo` and a private `__profd_foo` in a `comdat nodeduplicate`.
A `__attribute__((weak))` function `foo` has a weak hidden counter `__profc_foo`
and a private `__profd_foo` in a `comdat nodeduplicate`.
In `ld.lld a.o b.o`, say a.o defines an external linkage `foo` and b.o
defines a weak `foo`. Currently we treat `comdat nodeduplicate` as `comdat any`,
ld.lld will incorrectly consider `b.o:__profc_foo` non-prevailing. In the worst
case when `b.o:__profd_foo` is retained and `b.o:__profc_foo` isn't, there will
be dangling reference causing an `undefined hidden symbol` error.
Add SelectionKind to `Comdat` in IRSymtab and let linkers ignore nodeduplicate comdat.
Differential Revision: https://reviews.llvm.org/D106228
Diffstat (limited to 'llvm/lib/Object/IRSymtab.cpp')
-rw-r--r-- | llvm/lib/Object/IRSymtab.cpp | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/llvm/lib/Object/IRSymtab.cpp b/llvm/lib/Object/IRSymtab.cpp index bcada85..746b008 100644 --- a/llvm/lib/Object/IRSymtab.cpp +++ b/llvm/lib/Object/IRSymtab.cpp @@ -199,6 +199,7 @@ Expected<int> Builder::getComdatIndex(const Comdat *C, const Module *M) { storage::Comdat Comdat; setStr(Comdat.Name, Saver.save(Name)); + Comdat.SelectionKind = C->getSelectionKind(); Comdats.push_back(Comdat); } |