Don't crash in a strange .size directive.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 5 Oct 2010 21:02:45 +0000 (21:02 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 5 Oct 2010 21:02:45 +0000 (21:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115684 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/ELFObjectWriter.cpp
test/MC/ELF/size.s [new file with mode: 0644]

index 72a6cbd5ef44171b4ac04031cacef4740dc6cb90..faba61ee0c56735c79b9b3e145b3d3cd85cc3281 100644 (file)
@@ -445,12 +445,22 @@ void ELFObjectWriterImpl::WriteSymbol(MCDataFragment *F, ELFSymbolData &MSD,
       const MCBinaryExpr *BE = static_cast<const MCBinaryExpr *>(ESize);
 
       if (BE->EvaluateAsRelocatable(Res, &Layout)) {
-        MCSymbolData &A =
-          Layout.getAssembler().getSymbolData(Res.getSymA()->getSymbol());
-        MCSymbolData &B =
-          Layout.getAssembler().getSymbolData(Res.getSymB()->getSymbol());
+        uint64_t AddressA = 0;
+        uint64_t AddressB = 0;
+        const MCSymbol &SymA = Res.getSymA()->getSymbol();
+        const MCSymbol &SymB = Res.getSymB()->getSymbol();
+
+        if (SymA.isDefined()) {
+          MCSymbolData &A = Layout.getAssembler().getSymbolData(SymA);
+          AddressA = Layout.getSymbolAddress(&A);
+        }
+
+        if (SymB.isDefined()) {
+          MCSymbolData &B = Layout.getAssembler().getSymbolData(SymB);
+          AddressB = Layout.getSymbolAddress(&B);
+        }
 
-        Size = Layout.getSymbolAddress(&A) - Layout.getSymbolAddress(&B);
+        Size = AddressA - AddressB;
       }
     } else if (ESize->getKind() == MCExpr::Constant) {
       Size = static_cast<const MCConstantExpr *>(ESize)->getValue();
diff --git a/test/MC/ELF/size.s b/test/MC/ELF/size.s
new file mode 100644 (file)
index 0000000..a19bce0
--- /dev/null
@@ -0,0 +1,9 @@
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump  | FileCheck %s
+
+// Mostly a test that this doesn't crash anymore.
+
+// CHECK:        # Symbol 4
+// CHECK-NEXT:    (('st_name', 1) # 'foo'
+// CHECK-NEXT:     ('st_bind', 1)
+
+       .size   foo, .Lbar-foo