diff --git a/llvm/lib/MC/MCExpr.cpp b/llvm/lib/MC/MCExpr.cpp index ce918cc772ff..38a8af49c194 100644 --- a/llvm/lib/MC/MCExpr.cpp +++ b/llvm/lib/MC/MCExpr.cpp @@ -655,8 +655,12 @@ bool MCExpr::evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm, // the OS X assembler will completely drop the 4. We should probably // include it in the relocation or produce an error if that is not // possible. + // Allow constant expressions. if (!A && !B) return true; + // Allows aliases with zero offset. + if (Res.getConstant() == 0 && (!A || !B)) + return true; } } diff --git a/llvm/test/MC/MachO/alias.s b/llvm/test/MC/MachO/alias.s new file mode 100644 index 000000000000..aec04c63b68f --- /dev/null +++ b/llvm/test/MC/MachO/alias.s @@ -0,0 +1,12 @@ +// RUN: llvm-mc -triple x86_64-apple-macosx10.12.0 %s -filetype=obj | llvm-readobj -r | FileCheck %s + +l_a: +l_b = l_a +l_c = l_b + .long l_c + +// CHECK: Relocations [ +// CHECK-NEXT: Section __text { +// CHECK-NEXT: 0x0 0 2 1 X86_64_RELOC_UNSIGNED 0 l_c +// CHECK-NEXT: } +// CHECK-NEXT: ] diff --git a/llvm/test/MC/MachO/variable-exprs.s b/llvm/test/MC/MachO/variable-exprs.s index 5369622d8cfe..380e7e75cc75 100644 --- a/llvm/test/MC/MachO/variable-exprs.s +++ b/llvm/test/MC/MachO/variable-exprs.s @@ -110,8 +110,8 @@ Lt0_x = Lt0_a - Lt0_b // CHECK-I386: 0x2C 0 2 0 GENERIC_RELOC_VANILLA 0 __data // CHECK-I386: 0x28 0 2 0 GENERIC_RELOC_VANILLA 0 __data // CHECK-I386: 0x24 0 2 1 GENERIC_RELOC_VANILLA 0 d3 -// CHECK-I386: 0x20 0 2 1 GENERIC_RELOC_VANILLA 0 d2 -// CHECK-I386: 0x1C 0 2 1 GENERIC_RELOC_VANILLA 0 d +// CHECK-I386: 0x20 0 2 1 GENERIC_RELOC_VANILLA 0 d{{$}} +// CHECK-I386: 0x1C 0 2 1 GENERIC_RELOC_VANILLA 0 d{{$}} // CHECK-I386: 0x18 0 2 n/a GENERIC_RELOC_VANILLA 1 0x5 // CHECK-I386: 0x14 0 2 0 GENERIC_RELOC_VANILLA 0 __data // CHECK-I386: 0x10 0 2 0 GENERIC_RELOC_VANILLA 0 __data @@ -319,8 +319,8 @@ Lt0_x = Lt0_a - Lt0_b // CHECK-X86_64: 0x2C 0 2 1 X86_64_RELOC_UNSIGNED 0 g // CHECK-X86_64: 0x28 0 2 1 X86_64_RELOC_UNSIGNED 0 f // CHECK-X86_64: 0x24 0 2 1 X86_64_RELOC_UNSIGNED 0 d3 -// CHECK-X86_64: 0x20 0 2 1 X86_64_RELOC_UNSIGNED 0 d2 -// CHECK-X86_64: 0x1C 0 2 1 X86_64_RELOC_UNSIGNED 0 d +// CHECK-X86_64: 0x20 0 2 1 X86_64_RELOC_UNSIGNED 0 d{{$}} +// CHECK-X86_64: 0x1C 0 2 1 X86_64_RELOC_UNSIGNED 0 d{{$}} // CHECK-X86_64: 0x18 0 2 1 X86_64_RELOC_UNSIGNED 0 a // CHECK-X86_64: 0x14 0 2 1 X86_64_RELOC_UNSIGNED 0 e // CHECK-X86_64: 0x10 0 2 1 X86_64_RELOC_UNSIGNED 0 b