diff options
-rw-r--r-- | llvm/lib/MC/MCMachOStreamer.cpp | 11 | ||||
-rw-r--r-- | llvm/test/MC/MachO/altentry.s | 68 |
2 files changed, 52 insertions, 27 deletions
diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp index a72516375a7..7f0bfbd9a65 100644 --- a/llvm/lib/MC/MCMachOStreamer.cpp +++ b/llvm/lib/MC/MCMachOStreamer.cpp @@ -203,10 +203,13 @@ void MCMachOStreamer::EmitLabel(MCSymbol *Symbol) { void MCMachOStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) { MCValue Res; - if (Value->evaluateAsRelocatable(Res, nullptr, nullptr)) - if (Res.getSymA() && !Res.getSymB() && Res.getConstant() != 0) - cast<MCSymbolMachO>(Symbol)->setAltEntry(); - + if (Value->evaluateAsRelocatable(Res, nullptr, nullptr)) { + if (const MCSymbolRefExpr *SymAExpr = Res.getSymA()) { + const MCSymbol &SymA = SymAExpr->getSymbol(); + if (!Res.getSymB() && (SymA.getName() == "" || Res.getConstant() != 0)) + cast<MCSymbolMachO>(Symbol)->setAltEntry(); + } + } MCObjectStreamer::EmitAssignment(Symbol, Value); } diff --git a/llvm/test/MC/MachO/altentry.s b/llvm/test/MC/MachO/altentry.s index 73cc26120f4..e63db2b0ca1 100644 --- a/llvm/test/MC/MachO/altentry.s +++ b/llvm/test/MC/MachO/altentry.s @@ -1,31 +1,53 @@ // RUN: llvm-mc -triple x86_64-apple-darwin -filetype=obj %s -o - | llvm-readobj -t | FileCheck %s - // CHECK: Symbol { - // CHECK: Name: _offsetsym0 - // CHECK: Flags [ (0x0) - // CHECK: Value: 0x0 - - // CHECK: Symbol { - // CHECK: Name: _offsetsym1 - // CHECK: Flags [ (0x200) - // CHECK: Value: 0x4 - - // CHECK: Symbol { - // CHECK: Name: _offsetsym2 - // CHECK: Flags [ (0x200) - // CHECK: Value: 0x8 - - // CHECK: Symbol { - // CHECK: Name: _offsetsym3 - // CHECK: Flags [ (0x200) - // CHECK: Value: 0x18 - - // CHECK: Symbol { - // CHECK: Symbol { - // CHECK: Symbol { +// CHECK: Symbol { +// CHECK: Name: _foo +// CHECK: Flags [ (0x0) +// CHECK: Value: 0x0 + +// CHECK: Symbol { +// CHECK: Name: _bar +// CHECK: Flags [ (0x0) +// CHECK: Value: 0x0 + +// CHECK: Symbol { +// CHECK: Name: _baz +// CHECK: Flags [ (0x200) +// CHECK: Value: 0x1 + +// CHECK: Symbol { +// CHECK: Name: _offsetsym0 +// CHECK: Flags [ (0x0) +// CHECK: Value: 0x8 + +// CHECK: Symbol { +// CHECK: Name: _offsetsym1 +// CHECK: Flags [ (0x200) +// CHECK: Value: 0xC + +// CHECK: Symbol { +// CHECK: Name: _offsetsym2 +// CHECK: Flags [ (0x200) +// CHECK: Value: 0x10 + +// CHECK: Symbol { +// CHECK: Name: _offsetsym3 +// CHECK: Flags [ (0x200) +// CHECK: Value: 0x20 + +// CHECK: Symbol { +// CHECK: Symbol { +// CHECK: Symbol { .section __TEXT,__text,regular,pure_instructions + +_foo: +_bar = _foo + nop +_baz = . + .comm _g0,4,2 + .section __DATA,__data .globl _s0 .align 3 |