MC/Mach-O: Error out instead of crashing on invalid scattered relocation expressions.
authorDaniel Dunbar <daniel@zuster.org>
Mon, 8 Mar 2010 21:10:39 +0000 (21:10 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Mon, 8 Mar 2010 21:10:39 +0000 (21:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97983 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCAssembler.cpp

index 96227dbee508cbc38d86d2c45e5c4586184751b4..3f40a6d6a4c1f68d48be187bd5cd19cf167fbb5f 100644 (file)
@@ -447,13 +447,22 @@ public:
     // See <reloc.h>.
     const MCSymbol *A = Target.getSymA();
     MCSymbolData *SD = SymbolMap.lookup(A);
+
+    if (!SD->getFragment())
+      llvm_report_error("symbol '" + A->getName() +
+                        "' can not be undefined in a subtraction expression");
+
     uint32_t Value = SD->getFragment()->getAddress() + SD->getOffset();
     uint32_t Value2 = 0;
 
     if (const MCSymbol *B = Target.getSymB()) {
-      Type = RIT_LocalDifference;
-
       MCSymbolData *SD = SymbolMap.lookup(B);
+
+      if (!SD->getFragment())
+        llvm_report_error("symbol '" + B->getName() +
+                          "' can not be undefined in a subtraction expression");
+
+      Type = RIT_LocalDifference;
       Value2 = SD->getFragment()->getAddress() + SD->getOffset();
     }