[MachO] Extend the alt_entry support for aliases added in r263521 to
authorLang Hames <lhames@gmail.com>
Tue, 15 Mar 2016 04:20:49 +0000 (04:20 +0000)
committerLang Hames <lhames@gmail.com>
Tue, 15 Mar 2016 04:20:49 +0000 (04:20 +0000)
expressions of the form 'a = .' and 'a = Ltmp'.

llvm-svn: 263528

llvm/lib/MC/MCMachOStreamer.cpp
llvm/test/MC/MachO/altentry.s

index a725163..7f0bfbd 100644 (file)
@@ -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);
 }
 
index 73cc261..e63db2b 100644 (file)
@@ -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