diff options
-rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 20 | ||||
-rw-r--r-- | test/MC/ELF/size.s | 9 |
2 files changed, 24 insertions, 5 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 72a6cbd5ef..faba61ee0c 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -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 index 0000000000..a19bce08f1 --- /dev/null +++ b/test/MC/ELF/size.s @@ -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 |