diff options
| author | Alexey Samsonov <samsonov@google.com> | 2014-02-26 12:51:19 +0000 |
|---|---|---|
| committer | Alexey Samsonov <samsonov@google.com> | 2014-02-26 12:51:19 +0000 |
| commit | 65056a39f31d5c556b35f17ff40bdf432a725de4 (patch) | |
| tree | d40e6f18e3232b45d6f0a9440ed330846345bbcb /llvm | |
| parent | 4ca51b9ace3e515da4cf3cece4b46df026e81fda (diff) | |
| download | bcm5719-llvm-65056a39f31d5c556b35f17ff40bdf432a725de4.tar.gz bcm5719-llvm-65056a39f31d5c556b35f17ff40bdf432a725de4.zip | |
Move getELFDynamicSymbolIterators to a public header.
llvm-svn: 202264
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Object/ELFObjectFile.h | 19 | ||||
| -rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 29 |
2 files changed, 23 insertions, 25 deletions
diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h index ae6b6068d50..917786fd227 100644 --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -1015,6 +1015,25 @@ static inline error_code getELFRelocationAddend(const RelocationRef R, llvm_unreachable("Object passed to getELFRelocationAddend() is not ELF"); } +static inline std::pair<symbol_iterator, symbol_iterator> +getELFDynamicSymbolIterators(SymbolicFile *Obj) { + if (const ELF32LEObjectFile *ELF = dyn_cast<ELF32LEObjectFile>(Obj)) + return std::make_pair(ELF->dynamic_symbol_begin(), + ELF->dynamic_symbol_end()); + if (const ELF64LEObjectFile *ELF = dyn_cast<ELF64LEObjectFile>(Obj)) + return std::make_pair(ELF->dynamic_symbol_begin(), + ELF->dynamic_symbol_end()); + if (const ELF32BEObjectFile *ELF = dyn_cast<ELF32BEObjectFile>(Obj)) + return std::make_pair(ELF->dynamic_symbol_begin(), + ELF->dynamic_symbol_end()); + if (const ELF64BEObjectFile *ELF = cast<ELF64BEObjectFile>(Obj)) + return std::make_pair(ELF->dynamic_symbol_begin(), + ELF->dynamic_symbol_end()); + + llvm_unreachable( + "Object passed to getELFDynamicSymbolIterators() is not ELF"); +} + /// This is a generic interface for retrieving GNU symbol version /// information from an ELFObjectFile. static inline error_code GetELFSymbolVersion(const ObjectFile *Obj, diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index d93177e245c..ffdc7737803 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -462,30 +462,6 @@ static char getNMTypeChar(SymbolicFile *Obj, basic_symbol_iterator I) { return Ret; } -static void getDynamicSymbolIterators(SymbolicFile *Obj, - basic_symbol_iterator &Begin, - basic_symbol_iterator &End) { - if (ELF32LEObjectFile *ELF = dyn_cast<ELF32LEObjectFile>(Obj)) { - Begin = ELF->dynamic_symbol_begin(); - End = ELF->dynamic_symbol_end(); - return; - } - if (ELF64LEObjectFile *ELF = dyn_cast<ELF64LEObjectFile>(Obj)) { - Begin = ELF->dynamic_symbol_begin(); - End = ELF->dynamic_symbol_end(); - return; - } - if (ELF32BEObjectFile *ELF = dyn_cast<ELF32BEObjectFile>(Obj)) { - Begin = ELF->dynamic_symbol_begin(); - End = ELF->dynamic_symbol_end(); - return; - } - ELF64BEObjectFile *ELF = cast<ELF64BEObjectFile>(Obj); - Begin = ELF->dynamic_symbol_begin(); - End = ELF->dynamic_symbol_end(); - return; -} - static void dumpSymbolNamesFromObject(SymbolicFile *Obj) { basic_symbol_iterator IBegin = Obj->symbol_begin(); basic_symbol_iterator IEnd = Obj->symbol_end(); @@ -494,7 +470,10 @@ static void dumpSymbolNamesFromObject(SymbolicFile *Obj) { error("File format has no dynamic symbol table", Obj->getFileName()); return; } - getDynamicSymbolIterators(Obj, IBegin, IEnd); + std::pair<symbol_iterator, symbol_iterator> IDyn = + getELFDynamicSymbolIterators(Obj); + IBegin = IDyn.first; + IEnd = IDyn.second; } std::string NameBuffer; raw_string_ostream OS(NameBuffer); |

