Commit 5d57578a authored by Leonard Grey's avatar Leonard Grey Committed by Nico Weber
Browse files

[MC] Recursively calculate symbol offset

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
parent 14127190
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -128,7 +128,11 @@ 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;
  }
@@ -136,7 +140,7 @@ static bool getSymbolOffsetImpl(const MCAsmLayout &Layout, const MCSymbol &S,
  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;
  }
+12 −0
Original line number Diff line number Diff line
// 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