diff --git a/llvm/lib/MC/MCFragment.cpp b/llvm/lib/MC/MCFragment.cpp --- a/llvm/lib/MC/MCFragment.cpp +++ b/llvm/lib/MC/MCFragment.cpp @@ -128,7 +128,11 @@ 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 @@ 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; } diff --git a/llvm/test/MC/MachO/chained-alias-offset.s b/llvm/test/MC/MachO/chained-alias-offset.s new file mode 100644 --- /dev/null +++ b/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