MachOWriter: Don't crash on fixups with arithmetic, emit a relocation instead. This...
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 12 Aug 2011 01:51:29 +0000 (01:51 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 12 Aug 2011 01:51:29 +0000 (01:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137414 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MachObjectWriter.cpp
test/MC/MachO/x86_64-reloc-arithmetic.s [new file with mode: 0644]

index 6f64bdf40bea5188231c3afb787110fc72c85379..7011916770fbe3ea91b9910b1273a6be6fe55841 100644 (file)
@@ -595,9 +595,13 @@ IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
       return false;
   }
 
-  const MCFragment &FA = *Asm.getSymbolData(SA).getFragment();
+  const MCFragment *FA = Asm.getSymbolData(SA).getFragment();
 
-  A_Base = FA.getAtom();
+  // Bail if the symbol has no fragment.
+  if (!FA)
+    return false;
+
+  A_Base = FA->getAtom();
   if (!A_Base)
     return false;
 
diff --git a/test/MC/MachO/x86_64-reloc-arithmetic.s b/test/MC/MachO/x86_64-reloc-arithmetic.s
new file mode 100644 (file)
index 0000000..e82f69b
--- /dev/null
@@ -0,0 +1,21 @@
+// RUN: llvm-mc -triple x86_64-apple-darwin10 %s -filetype=obj -o - | macho-dump | FileCheck %s
+
+// rdar://9906375
+.org 0x100
+_foo:
+_bar = _foo + 2
+_baz:
+        leaq    _bar(%rip), %rcx
+
+// CHECK:        ('_relocations', [
+// CHECK-NEXT:    # Relocation 0
+// CHECK-NEXT:    (('word-0', 0x103),
+// CHECK-NEXT:     ('word-1', 0x1d000001))
+
+// CHECK:         # Symbol 1
+// CHECK-NEXT:   (('n_strx', 6)
+// CHECK-NEXT:    ('n_type', 0xe)
+// CHECK-NEXT:    ('n_sect', 1)
+// CHECK-NEXT:    ('n_desc', 0)
+// CHECK-NEXT:    ('n_value', 258)
+// CHECK-NEXT:    ('_string', '_bar')