From 2cdc3d6235c5dfa1483f7732db38026e1bc12c2c Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 14 Oct 2010 16:34:44 +0000 Subject: [PATCH] Remove some code duplication. llvm-svn: 116484 --- lib/MC/ELFObjectWriter.cpp | 67 ++++++++++---------------------------- test/MC/ELF/alias.s | 10 +++--- test/MC/ELF/undef.s | 6 ++-- 3 files changed, 26 insertions(+), 57 deletions(-) diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 8a8d68e55a8..9a181621c77 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -781,7 +781,7 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) { StringMap StringIndexMap; StringTable += '\x00'; - // Add the data for local symbols. + // Add the data for the symbols. for (MCAssembler::symbol_iterator it = Asm.symbol_begin(), ie = Asm.symbol_end(); it != ie; ++it) { const MCSymbol &Symbol = it->getSymbol(); @@ -789,9 +789,6 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) { if (!isInSymtab(Asm, *it, UsedInReloc.count(&Symbol))) continue; - if (!isLocal(*it)) - continue; - uint64_t &Entry = StringIndexMap[Symbol.getName()]; if (!Entry) { Entry = StringTable.size(); @@ -802,50 +799,18 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) { ELFSymbolData MSD; MSD.SymbolData = it; MSD.StringIndex = Entry; + bool Local = isLocal(*it); - if (Symbol.isAbsolute()) { - MSD.SectionIndex = ELF::SHN_ABS; - LocalSymbolData.push_back(MSD); - } else { - const MCSymbol *SymbolP = &Symbol; - if (Symbol.isVariable()) { - const MCExpr *Value = Symbol.getVariableValue(); - assert (Value->getKind() == MCExpr::SymbolRef && "Unimplemented"); - const MCSymbolRefExpr *Ref = static_cast(Value); - SymbolP = &Ref->getSymbol(); - } - MSD.SectionIndex = SectionIndexMap.lookup(&SymbolP->getSection()); - assert(MSD.SectionIndex && "Invalid section index!"); - LocalSymbolData.push_back(MSD); - } - } - - // Now add non-local symbols. - for (MCAssembler::symbol_iterator it = Asm.symbol_begin(), - ie = Asm.symbol_end(); it != ie; ++it) { - const MCSymbol &Symbol = it->getSymbol(); - - if (!isInSymtab(Asm, *it, UsedInReloc.count(&Symbol))) - continue; - - if (isLocal(*it)) - continue; - - uint64_t &Entry = StringIndexMap[Symbol.getName()]; - if (!Entry) { - Entry = StringTable.size(); - StringTable += Symbol.getName(); - StringTable += '\x00'; - } - - ELFSymbolData MSD; - MSD.SymbolData = it; - MSD.StringIndex = Entry; - - // FIXME: There is duplicated code with the local case. if (it->isCommon()) { + assert(!Local); MSD.SectionIndex = ELF::SHN_COMMON; ExternalSymbolData.push_back(MSD); + } else if (Symbol.isAbsolute()) { + MSD.SectionIndex = ELF::SHN_ABS; + if (Local) + LocalSymbolData.push_back(MSD); + else + ExternalSymbolData.push_back(MSD); } else if (Symbol.isVariable()) { const MCExpr *Value = Symbol.getVariableValue(); assert (Value->getKind() == MCExpr::SymbolRef && "Unimplemented"); @@ -854,22 +819,26 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) { if (RefSymbol.isDefined()) { MSD.SectionIndex = SectionIndexMap.lookup(&RefSymbol.getSection()); assert(MSD.SectionIndex && "Invalid section index!"); - ExternalSymbolData.push_back(MSD); + if (Local) + LocalSymbolData.push_back(MSD); + else + ExternalSymbolData.push_back(MSD); } } else if (Symbol.isUndefined()) { + assert(!Local); MSD.SectionIndex = ELF::SHN_UNDEF; // FIXME: Undefined symbols are global, but this is the first place we // are able to set it. if (GetBinding(*it) == ELF::STB_LOCAL) SetBinding(*it, ELF::STB_GLOBAL); UndefinedSymbolData.push_back(MSD); - } else if (Symbol.isAbsolute()) { - MSD.SectionIndex = ELF::SHN_ABS; - ExternalSymbolData.push_back(MSD); } else { MSD.SectionIndex = SectionIndexMap.lookup(&Symbol.getSection()); assert(MSD.SectionIndex && "Invalid section index!"); - ExternalSymbolData.push_back(MSD); + if (Local) + LocalSymbolData.push_back(MSD); + else + ExternalSymbolData.push_back(MSD); } } diff --git a/test/MC/ELF/alias.s b/test/MC/ELF/alias.s index 4a30e496a1f..604131c3ee5 100644 --- a/test/MC/ELF/alias.s +++ b/test/MC/ELF/alias.s @@ -25,7 +25,7 @@ bar4 = foo4 // CHECK-NEXT: ('st_size', 0) // CHECK-NEXT: ), // CHECK-NEXT: # Symbol 2 -// CHECK-NEXT: (('st_name', 19) # 'bar4' +// CHECK-NEXT: (('st_name', 34) # 'bar4' // CHECK-NEXT: ('st_bind', 0) // CHECK-NEXT: ('st_type', 2) // CHECK-NEXT: ('st_other', 0) @@ -43,7 +43,7 @@ bar4 = foo4 // CHECK-NEXT: ('st_size', 0) // CHECK-NEXT: ), // CHECK-NEXT: # Symbol 4 -// CHECK-NEXT: (('st_name', 9) # 'foo3' +// CHECK-NEXT: (('st_name', 19) # 'foo3' // CHECK-NEXT: ('st_bind', 0) // CHECK-NEXT: ('st_type', 0) // CHECK-NEXT: ('st_other', 0) @@ -52,7 +52,7 @@ bar4 = foo4 // CHECK-NEXT: ('st_size', 0) // CHECK-NEXT: ), // CHECK-NEXT: # Symbol 5 -// CHECK-NEXT: (('st_name', 14) # 'foo4' +// CHECK-NEXT: (('st_name', 29) # 'foo4' // CHECK-NEXT: ('st_bind', 0) // CHECK-NEXT: ('st_type', 2) // CHECK-NEXT: ('st_other', 0) @@ -67,7 +67,7 @@ bar4 = foo4 // CHECK: # Symbol 8 // CHECK-NEXT: (('st_name', 0) # '' // CHECK: # Symbol 9 -// CHECK-NEXT: (('st_name', 34) # 'bar3' +// CHECK-NEXT: (('st_name', 24) # 'bar3' // CHECK-NEXT: ('st_bind', 1) // CHECK-NEXT: ('st_type', 0) // CHECK-NEXT: ('st_other', 0) @@ -75,7 +75,7 @@ bar4 = foo4 // CHECK-NEXT: ('st_value', 0) // CHECK-NEXT: ('st_size', 0) // CHECK: # Symbol 10 -// CHECK-NEXT: (('st_name', 29) # 'bar2' +// CHECK-NEXT: (('st_name', 14) # 'bar2' // CHECK-NEXT: ('st_bind', 1) // CHECK-NEXT: ('st_type', 0) // CHECK-NEXT: ('st_other', 0) diff --git a/test/MC/ELF/undef.s b/test/MC/ELF/undef.s index ff33aa5fec9..1f6a52bffe5 100644 --- a/test/MC/ELF/undef.s +++ b/test/MC/ELF/undef.s @@ -22,7 +22,7 @@ // CHECK-NEXT: # Symbol 0 // CHECK-NEXT: (('st_name', 0) # '' // CHECK: # Symbol 1 -// CHECK-NEXT: (('st_name', 1) # '.Lsym8' +// CHECK-NEXT: (('st_name', 13) # '.Lsym8' // CHECK: # Symbol 2 // CHECK-NEXT: (('st_name', 0) # '' // CHECK: # Symbol 3 @@ -32,9 +32,9 @@ // CHECK: # Symbol 5 // CHECK-NEXT: (('st_name', 0) # '' // CHECK: # Symbol 6 -// CHECK-NEXT: (('st_name', 8) # '.Lsym1' +// CHECK-NEXT: (('st_name', 1) # '.Lsym1' // CHECK: # Symbol 7 -// CHECK-NEXT: (('st_name', 15) # 'sym6' +// CHECK-NEXT: (('st_name', 8) # 'sym6' // CHECK-NEXT: ('st_bind', 1) // CHECK-NEXT: ('st_type', 1) // CHECK-NEXT: ('st_other', 0)