diff options
| author | Rui Ueyama <ruiu@google.com> | 2015-10-12 15:31:09 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2015-10-12 15:31:09 +0000 |
| commit | c4b6506521783ab26753507f91744adbd8c672f5 (patch) | |
| tree | 7fe1dd11ead9f23b697098df851e0507c7ec1f07 | |
| parent | 2ee8e113ba0d7a52a55646aebfdc86f65a0046c6 (diff) | |
| download | bcm5719-llvm-c4b6506521783ab26753507f91744adbd8c672f5.tar.gz bcm5719-llvm-c4b6506521783ab26753507f91744adbd8c672f5.zip | |
ELF2: Move createELFFile() from .h to .cpp.
llvm-svn: 250051
| -rw-r--r-- | lld/ELF/InputFiles.cpp | 40 | ||||
| -rw-r--r-- | lld/ELF/InputFiles.h | 36 |
2 files changed, 41 insertions, 35 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index f5cab485955..e7d1d42c24f 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -314,6 +314,43 @@ template <class ELFT> void SharedFile<ELFT>::parse() { } } +template <typename T> +static std::unique_ptr<InputFile> createELFFileAux(MemoryBufferRef MB) { + std::unique_ptr<T> Ret = llvm::make_unique<T>(MB); + + if (!Config->FirstElf) + Config->FirstElf = Ret.get(); + + if (Config->ElfKind == ELFNoneKind) { + Config->ElfKind = Ret->getELFKind(); + Config->EMachine = Ret->getEMachine(); + } + + return std::move(Ret); +} + +template <template <class> class T> +std::unique_ptr<InputFile> lld::elf2::createELFFile(MemoryBufferRef MB) { + using namespace llvm; + + std::pair<unsigned char, unsigned char> Type = + object::getElfArchType(MB.getBuffer()); + if (Type.second != ELF::ELFDATA2LSB && Type.second != ELF::ELFDATA2MSB) + error("Invalid data encoding: " + MB.getBufferIdentifier()); + + if (Type.first == ELF::ELFCLASS32) { + if (Type.second == ELF::ELFDATA2LSB) + return createELFFileAux<T<object::ELF32LE>>(MB); + return createELFFileAux<T<object::ELF32BE>>(MB); + } + if (Type.first == ELF::ELFCLASS64) { + if (Type.second == ELF::ELFDATA2LSB) + return createELFFileAux<T<object::ELF64LE>>(MB); + return createELFFileAux<T<object::ELF64BE>>(MB); + } + error("Invalid file class: " + MB.getBufferIdentifier()); +} + namespace lld { namespace elf2 { template class ELFFileBase<llvm::object::ELF32LE>; @@ -330,5 +367,8 @@ template class SharedFile<llvm::object::ELF32LE>; template class SharedFile<llvm::object::ELF32BE>; template class SharedFile<llvm::object::ELF64LE>; template class SharedFile<llvm::object::ELF64BE>; + +template std::unique_ptr<InputFile> createELFFile<ObjectFile>(MemoryBufferRef); +template std::unique_ptr<InputFile> createELFFile<SharedFile>(MemoryBufferRef); } } diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h index ae95f679041..2fee75fb6de 100644 --- a/lld/ELF/InputFiles.h +++ b/lld/ELF/InputFiles.h @@ -197,42 +197,8 @@ public: bool isNeeded() const { return !AsNeeded || IsUsed; } }; -template <typename T> -std::unique_ptr<InputFile> createELFFileAux(MemoryBufferRef MB) { - std::unique_ptr<T> Ret = llvm::make_unique<T>(MB); - - if (!Config->FirstElf) - Config->FirstElf = Ret.get(); - - if (Config->ElfKind == ELFNoneKind) { - Config->ElfKind = Ret->getELFKind(); - Config->EMachine = Ret->getEMachine(); - } - - return std::move(Ret); -} - template <template <class> class T> -std::unique_ptr<InputFile> createELFFile(MemoryBufferRef MB) { - using namespace llvm; - - std::pair<unsigned char, unsigned char> Type = - object::getElfArchType(MB.getBuffer()); - if (Type.second != ELF::ELFDATA2LSB && Type.second != ELF::ELFDATA2MSB) - error("Invalid data encoding: " + MB.getBufferIdentifier()); - - if (Type.first == ELF::ELFCLASS32) { - if (Type.second == ELF::ELFDATA2LSB) - return createELFFileAux<T<object::ELF32LE>>(MB); - return createELFFileAux<T<object::ELF32BE>>(MB); - } - if (Type.first == ELF::ELFCLASS64) { - if (Type.second == ELF::ELFDATA2LSB) - return createELFFileAux<T<object::ELF64LE>>(MB); - return createELFFileAux<T<object::ELF64BE>>(MB); - } - error("Invalid file class: " + MB.getBufferIdentifier()); -} +std::unique_ptr<InputFile> createELFFile(MemoryBufferRef MB); } // namespace elf2 } // namespace lld |

