[llvm-branch-commits] [lld] 4acca1b - [ELF] mergeCmp: work around irreflexivity bug

Tom Stellard via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Aug 8 12:40:15 PDT 2022


Author: Fangrui Song
Date: 2022-08-08T12:39:51-07:00
New Revision: 4acca1b014ece0073fd33c384b86b7a29dd3df9d

URL: https://github.com/llvm/llvm-project/commit/4acca1b014ece0073fd33c384b86b7a29dd3df9d
DIFF: https://github.com/llvm/llvm-project/commit/4acca1b014ece0073fd33c384b86b7a29dd3df9d.diff

LOG: [ELF] mergeCmp: work around irreflexivity bug

Some tests (e.g. aarch64-feature-pac.s) segfault in libstdc++ _GLIBCXX_DEBUG
builds (enabled by LLVM_ENABLE_EXPENSIVE_CHECKS).

dyn_cast<ThunkSection> is incorrectly true for any SyntheticSection. std::merge
transitively calls mergeCmp(x, x) (due to __glibcxx_requires_irreflexive_pred)
and will segfault in `ta->getTargetInputSection()`. The dyn_cast<ThunkSection>
issue should be eventually fixed properly, bug `a != b` is robust enough for now.

(cherry picked from commit abd9807590fc10eb92eb22aea7b50dbf08db7e9d)

Added: 
    

Modified: 
    lld/ELF/Relocations.cpp

Removed: 
    


################################################################################
diff  --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp
index e54e1ebd41bb8..53af34ef20855 100644
--- a/lld/ELF/Relocations.cpp
+++ b/lld/ELF/Relocations.cpp
@@ -1705,7 +1705,8 @@ static bool mergeCmp(const InputSection *a, const InputSection *b) {
   if (a->outSecOff < b->outSecOff)
     return true;
 
-  if (a->outSecOff == b->outSecOff) {
+  // FIXME dyn_cast<ThunkSection> is non-null for any SyntheticSection.
+  if (a->outSecOff == b->outSecOff && a != b) {
     auto *ta = dyn_cast<ThunkSection>(a);
     auto *tb = dyn_cast<ThunkSection>(b);
 


        


More information about the llvm-branch-commits mailing list