[llvm] r188218 - Fix a crash with X86 Mach-O and a subtraction expression where both symbols are

Kevin Enderby enderby at apple.com
Mon Aug 12 15:45:45 PDT 2013


Author: enderby
Date: Mon Aug 12 17:45:44 2013
New Revision: 188218

URL: http://llvm.org/viewvc/llvm-project?rev=188218&view=rev
Log:
Fix a crash with X86 Mach-O and a subtraction expression where both symbols are
undefined and produce an error message instead as this is a non-relocatable
expression with X86 Mach-O.

rdar://8920876

Added:
    llvm/trunk/test/MC/MachO/bad-darwin-x86_64-diff-relocs.s
Modified:
    llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp

Modified: llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp?rev=188218&r1=188217&r2=188218&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp (original)
+++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp Mon Aug 12 17:45:44 2013
@@ -175,6 +175,11 @@ void X86MachObjectWriter::RecordX86_64Re
     if (A_Base == B_Base && A_Base)
       report_fatal_error("unsupported relocation with identical base");
 
+    // A subtraction expression where both symbols are undefined is a
+    // non-relocatable expression.
+    if (A->isUndefined() && B->isUndefined())
+      report_fatal_error("unsupported relocation with subtraction expression");
+
     Value += Writer->getSymbolAddress(&A_SD, Layout) -
       (A_Base == NULL ? 0 : Writer->getSymbolAddress(A_Base, Layout));
     Value -= Writer->getSymbolAddress(&B_SD, Layout) -

Added: llvm/trunk/test/MC/MachO/bad-darwin-x86_64-diff-relocs.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/bad-darwin-x86_64-diff-relocs.s?rev=188218&view=auto
==============================================================================
--- llvm/trunk/test/MC/MachO/bad-darwin-x86_64-diff-relocs.s (added)
+++ llvm/trunk/test/MC/MachO/bad-darwin-x86_64-diff-relocs.s Mon Aug 12 17:45:44 2013
@@ -0,0 +1,5 @@
+// RUN: not llvm-mc -triple x86_64-apple-darwin10 %s -filetype=obj -o - 2> %t.err > %t
+// RUN: FileCheck --check-prefix=CHECK-ERROR < %t.err %s
+
+.quad _foo - _bar
+// CHECK-ERROR: unsupported relocation with subtraction expression





More information about the llvm-commits mailing list