From 2fe0c785f579ce1ed9571a3a91e635a26593b072 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Tue, 2 Jul 2024 15:19:28 -0700 Subject: [PATCH] [MC] Don't treat altentry symbols as atoms The current `setAtom` is inaccurate: a `.alt_entry` label can also be recognized as an atom. This is mostly benign, but might cause two locations only separated by an `.alt_entry` to have different atoms. https://reviews.llvm.org/D153167 changed a `evaluateKnownAbsolute` to `evaluateAsAbsolute` and would not fold `A-B` even if they are only separated by a `.alt_entry` label, leading to a spurious error `invalid CFI advance_loc expression`. The fix is similar to #82268: add a special case for `.alt_entry`. Fix #97116 Pull Request: https://github.com/llvm/llvm-project/pull/97479 --- llvm/lib/MC/MCMachOStreamer.cpp | 2 +- llvm/test/MC/MachO/cfi-advance-loc-err.s | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp index d67b95820a8a9d..0b34d87033b7b4 100644 --- a/llvm/lib/MC/MCMachOStreamer.cpp +++ b/llvm/lib/MC/MCMachOStreamer.cpp @@ -508,7 +508,7 @@ void MCMachOStreamer::finishImpl() { DenseMap DefiningSymbolMap; for (const MCSymbol &Symbol : getAssembler().symbols()) { if (getAssembler().isSymbolLinkerVisible(Symbol) && Symbol.isInSection() && - !Symbol.isVariable()) { + !Symbol.isVariable() && !cast(Symbol).isAltEntry()) { // An atom defining symbol should never be internal to a fragment. assert(Symbol.getOffset() == 0 && "Invalid offset in atom defining symbol!"); diff --git a/llvm/test/MC/MachO/cfi-advance-loc-err.s b/llvm/test/MC/MachO/cfi-advance-loc-err.s index 3143dd84efc638..77b6544cb12d8b 100644 --- a/llvm/test/MC/MachO/cfi-advance-loc-err.s +++ b/llvm/test/MC/MachO/cfi-advance-loc-err.s @@ -9,6 +9,11 @@ _foo: subq $8, %rsp .cfi_adjust_cfa_offset 8 + .alt_entry _bar +_bar: # alt_entry label can appear here as it is not an atom + addq $8, %rsp + .cfi_adjust_cfa_offset -8 + tmp0: # non-private label cannot appear here addq $8, %rsp # CHECK: :[[#@LINE+1]]:3: error: invalid CFI advance_loc expression