MCELF: Use precomputed symbol indices, patch by Roman Divacky.
authorBenjamin Kramer <benny.kra@googlemail.com>
Wed, 25 Aug 2010 20:09:43 +0000 (20:09 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Wed, 25 Aug 2010 20:09:43 +0000 (20:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112079 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/ELFObjectWriter.cpp

index 8fb6ff60f8909d9af5d85f7ed602f5e33361a85b..79bb52871d43f2615192b120d062e7273ff432bd 100644 (file)
@@ -567,18 +567,14 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
 uint64_t
 ELFObjectWriterImpl::getSymbolIndexInSymbolTable(const MCAssembler &Asm,
                                                  const MCSymbol *S) {
-  for (unsigned i = 0, e = LocalSymbolData.size(); i != e; ++i)
-    if (&LocalSymbolData[i].SymbolData->getSymbol() == S)
-      return i + /* empty symbol */ 1;
-  for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i)
-    if (&ExternalSymbolData[i].SymbolData->getSymbol() == S)
-      return i + LocalSymbolData.size() + Asm.size() + /* empty symbol */ 1;
-  for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i)
-    if (&UndefinedSymbolData[i].SymbolData->getSymbol() == S)
-      return i + LocalSymbolData.size() + ExternalSymbolData.size() +
-             Asm.size() + /* empty symbol */ 1;
+  MCSymbolData &SD = Asm.getSymbolData(*S);
+
+  // Local symbol.
+  if (!SD.isExternal() && !S->isUndefined())
+    return SD.getIndex() + /* empty symbol */ 1;
 
-  llvm_unreachable("Cannot find symbol which should exist!");
+  // External or undefined symbol.
+  return SD.getIndex() + Asm.size() + /* empty symbol */ 1;
 }
 
 void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) {