diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-06-05 02:55:01 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-06-05 02:55:01 +0000 |
commit | 0962b1683f242cd6274423c24f0059832284b1c8 (patch) | |
tree | 3e3fb61861001302cd89777f74d030076ac82834 /lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp | |
parent | 5fd5fe0f7bfac0f7973475fcf7a5f8061d983538 (diff) | |
download | llvm-0962b1683f242cd6274423c24f0059832284b1c8.tar.gz llvm-0962b1683f242cd6274423c24f0059832284b1c8.tar.bz2 llvm-0962b1683f242cd6274423c24f0059832284b1c8.tar.xz |
Handle (at least don't crash on) relocations with no symbols.
Should fix the MCJIT tests on PPC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183288 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp')
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp index e552cea1bc..722ed10f73 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp @@ -780,23 +780,28 @@ void RuntimeDyldELF::processRelocationRef(unsigned SectionID, // Obtain the symbol name which is referenced in the relocation StringRef TargetName; - Symbol->getName(TargetName); + if (Symbol != Obj.end_symbols()) + Symbol->getName(TargetName); DEBUG(dbgs() << "\t\tRelType: " << RelType << " Addend: " << Addend << " TargetName: " << TargetName << "\n"); RelocationValueRef Value; // First search for the symbol in the local symbol table - SymbolTableMap::const_iterator lsi = Symbols.find(TargetName.data()); - SymbolRef::Type SymType; - Symbol->getType(SymType); + SymbolTableMap::const_iterator lsi = Symbols.end(); + SymbolRef::Type SymType = SymbolRef::ST_Unknown; + if (Symbol != Obj.end_symbols()) { + lsi = Symbols.find(TargetName.data()); + Symbol->getType(SymType); + } if (lsi != Symbols.end()) { Value.SectionID = lsi->second.first; Value.Addend = lsi->second.second + Addend; } else { // Search for the symbol in the global symbol table - SymbolTableMap::const_iterator gsi = - GlobalSymbolTable.find(TargetName.data()); + SymbolTableMap::const_iterator gsi = GlobalSymbolTable.end(); + if (Symbol != Obj.end_symbols()) + gsi = GlobalSymbolTable.find(TargetName.data()); if (gsi != GlobalSymbolTable.end()) { Value.SectionID = gsi->second.first; Value.Addend = gsi->second.second + Addend; |