forked from OSchip/llvm-project
Don't crash in a strange .size directive.
llvm-svn: 115684
This commit is contained in:
parent
c080a333ce
commit
c58a37ea51
|
@ -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();
|
||||
|
||||
Size = Layout.getSymbolAddress(&A) - Layout.getSymbolAddress(&B);
|
||||
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 = AddressA - AddressB;
|
||||
}
|
||||
} else if (ESize->getKind() == MCExpr::Constant) {
|
||||
Size = static_cast<const MCConstantExpr *>(ESize)->getValue();
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue