Skip to content

Commit

Permalink
[MC] Recursively calculate symbol offset
Browse files Browse the repository at this point in the history
This is speculative since I'm not sure if there's some implicit contract that a
variable symbol must not have another variable symbol in its evaluation tree.

Downstream bug: https://bugs.chromium.org/p/chromium/issues/detail?id=471146#c23.

Test is based on alias.s (removed checks since we just need to know it didn't
crash).

Differential Revision: https://reviews.llvm.org/D109109
  • Loading branch information
speednoisemovement authored and nico committed Oct 20, 2021
1 parent 1412719 commit 5d57578
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
8 changes: 6 additions & 2 deletions llvm/lib/MC/MCFragment.cpp
Expand Up @@ -128,15 +128,19 @@ static bool getSymbolOffsetImpl(const MCAsmLayout &Layout, const MCSymbol &S,
const MCSymbolRefExpr *A = Target.getSymA();
if (A) {
uint64_t ValA;
if (!getLabelOffset(Layout, A->getSymbol(), ReportError, ValA))
// FIXME: On most platforms, `Target`'s component symbols are labels from
// having been simplified during evaluation, but on Mach-O they can be
// variables due to PR19203. This, and the line below for `B` can be
// restored to call `getLabelOffset` when PR19203 is fixed.
if (!getSymbolOffsetImpl(Layout, A->getSymbol(), ReportError, ValA))
return false;
Offset += ValA;
}

const MCSymbolRefExpr *B = Target.getSymB();
if (B) {
uint64_t ValB;
if (!getLabelOffset(Layout, B->getSymbol(), ReportError, ValB))
if (!getSymbolOffsetImpl(Layout, B->getSymbol(), ReportError, ValB))
return false;
Offset -= ValB;
}
Expand Down
12 changes: 12 additions & 0 deletions llvm/test/MC/MachO/chained-alias-offset.s
@@ -0,0 +1,12 @@
// RUN: llvm-mc -triple x86_64-apple-macos %s -filetype=obj | llvm-readobj --symbols - | FileCheck %s
l_a:
l_b = l_a + 1
l_c = l_b
.long l_c

// CHECK: Name: l_a
// CHECK: Value: 0x0
// CHECK: Name: l_b
// CHECK: Value: 0x1
// CHECK: Name: l_c
// CHECK: Value: 0x1

0 comments on commit 5d57578

Please sign in to comment.