blob: ecf9741999c9d6ffc8531302f59c12979e963073 [file] [log] [blame]
Shankar Easwarand7de1082014-01-27 00:45:57 +00001//===- lib/ReaderWriter/ELF/ELFReader.h -----------------------------------===//
2//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLD_READER_WRITER_ELF_READER_H
11#define LLD_READER_WRITER_ELF_READER_H
12
13#include "CreateELF.h"
14#include "DynamicFile.h"
15#include "ELFFile.h"
16
17#include "lld/ReaderWriter/Reader.h"
18
19namespace lld {
20namespace elf {
21
22struct DynamicFileCreateELFTraits {
23 typedef llvm::ErrorOr<std::unique_ptr<lld::SharedLibraryFile>> result_type;
24
25 template <class ELFT>
26 static result_type create(std::unique_ptr<llvm::MemoryBuffer> mb,
27 bool useUndefines) {
28 return lld::elf::DynamicFile<ELFT>::create(std::move(mb), useUndefines);
29 }
30};
31
32struct ELFFileCreateELFTraits {
33 typedef llvm::ErrorOr<std::unique_ptr<lld::File>> result_type;
34
35 template <class ELFT>
36 static result_type create(std::unique_ptr<llvm::MemoryBuffer> mb,
Shankar Easwarane7b831a2014-01-27 01:02:03 +000037 bool atomizeStrings) {
38 return lld::elf::ELFFile<ELFT>::create(std::move(mb), atomizeStrings);
Shankar Easwarand7de1082014-01-27 00:45:57 +000039 }
40};
41
42class ELFObjectReader : public Reader {
43public:
Shankar Easwarane7b831a2014-01-27 01:02:03 +000044 ELFObjectReader(bool atomizeStrings) : _atomizeStrings(atomizeStrings) {}
Shankar Easwarand7de1082014-01-27 00:45:57 +000045
Rui Ueyama9d0698e2014-03-28 21:26:13 +000046 bool canParse(file_magic magic, StringRef,
47 const MemoryBuffer &) const override {
Shankar Easwarand7de1082014-01-27 00:45:57 +000048 return (magic == llvm::sys::fs::file_magic::elf_relocatable);
49 }
50
Rui Ueyama9d0698e2014-03-28 21:26:13 +000051 error_code
Shankar Easwarand7de1082014-01-27 00:45:57 +000052 parseFile(std::unique_ptr<MemoryBuffer> &mb, const class Registry &,
Rui Ueyama9d0698e2014-03-28 21:26:13 +000053 std::vector<std::unique_ptr<File>> &result) const override {
Shankar Easwarand7de1082014-01-27 00:45:57 +000054 std::size_t maxAlignment =
55 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart()));
56 auto f = createELF<ELFFileCreateELFTraits>(
57 llvm::object::getElfArchType(&*mb), maxAlignment, std::move(mb),
Shankar Easwarane7b831a2014-01-27 01:02:03 +000058 _atomizeStrings);
Shankar Easwarand7de1082014-01-27 00:45:57 +000059 if (error_code ec = f.getError())
60 return ec;
61 result.push_back(std::move(*f));
62 return error_code::success();
63 }
64
Shankar Easwarane7b831a2014-01-27 01:02:03 +000065protected:
Shankar Easwarand7de1082014-01-27 00:45:57 +000066 bool _atomizeStrings;
Shankar Easwarand7de1082014-01-27 00:45:57 +000067};
68
69class ELFDSOReader : public Reader {
70public:
71 ELFDSOReader(bool useUndefines) : _useUndefines(useUndefines) {}
72
Rui Ueyama9d0698e2014-03-28 21:26:13 +000073 bool canParse(file_magic magic, StringRef,
74 const MemoryBuffer &) const override {
Shankar Easwarand7de1082014-01-27 00:45:57 +000075 return (magic == llvm::sys::fs::file_magic::elf_shared_object);
76 }
77
Rui Ueyama9d0698e2014-03-28 21:26:13 +000078 error_code
Shankar Easwarand7de1082014-01-27 00:45:57 +000079 parseFile(std::unique_ptr<MemoryBuffer> &mb, const class Registry &,
Rui Ueyama9d0698e2014-03-28 21:26:13 +000080 std::vector<std::unique_ptr<File>> &result) const override {
Shankar Easwarand7de1082014-01-27 00:45:57 +000081 std::size_t maxAlignment =
82 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart()));
83 auto f = createELF<DynamicFileCreateELFTraits>(
84 llvm::object::getElfArchType(&*mb), maxAlignment, std::move(mb),
85 _useUndefines);
86 if (error_code ec = f.getError())
87 return ec;
88 result.push_back(std::move(*f));
89 return error_code::success();
90 }
91
Shankar Easwarane7b831a2014-01-27 01:02:03 +000092protected:
Shankar Easwarand7de1082014-01-27 00:45:57 +000093 bool _useUndefines;
94};
95
96} // namespace elf
97} // namespace lld
98
99#endif // LLD_READER_WRITER_ELF_READER_H