blob: 2903251492b0623f973c28526475639cb9560d67 [file] [log] [blame]
Hubert Tongab2eb2b2019-04-04 00:53:21 +00001//===--- XCOFFObjectFile.cpp - XCOFF object file implementation -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the XCOFFObjectFile class.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/Object/XCOFFObjectFile.h"
14#include "llvm/ADT/ArrayRef.h"
15#include "llvm/Support/BinaryStreamReader.h"
16#include "llvm/Support/Endian.h"
17#include "llvm/Support/ErrorHandling.h"
18#include "llvm/Support/MathExtras.h"
19#include <cstddef>
20#include <cstring>
21
22namespace llvm {
23namespace object {
24
25// Sets Obj unless any bytes in [addr, addr + size) fall outsize of m.
26// Returns unexpected_eof on error.
27template <typename T>
28static std::error_code getObject(const T *&Obj, MemoryBufferRef M,
29 const void *Ptr,
30 const uint64_t Size = sizeof(T)) {
31 uintptr_t Addr = uintptr_t(Ptr);
32 if (std::error_code EC = Binary::checkOffset(M, Addr, Size))
33 return EC;
34 Obj = reinterpret_cast<const T *>(Addr);
35 return std::error_code();
36}
37
38void XCOFFObjectFile::moveSymbolNext(DataRefImpl &Symb) const {
39 llvm_unreachable("Not yet implemented!");
40 return;
41}
42
43Expected<StringRef> XCOFFObjectFile::getSymbolName(DataRefImpl Symb) const {
44 StringRef Result;
45 llvm_unreachable("Not yet implemented!");
46 return Result;
47}
48
49Expected<uint64_t> XCOFFObjectFile::getSymbolAddress(DataRefImpl Symb) const {
50 uint64_t Result = 0;
51 llvm_unreachable("Not yet implemented!");
52 return Result;
53}
54
55uint64_t XCOFFObjectFile::getSymbolValueImpl(DataRefImpl Symb) const {
56 uint64_t Result = 0;
57 llvm_unreachable("Not yet implemented!");
58 return Result;
59}
60
61uint64_t XCOFFObjectFile::getCommonSymbolSizeImpl(DataRefImpl Symb) const {
62 uint64_t Result = 0;
63 llvm_unreachable("Not yet implemented!");
64 return Result;
65}
66
67Expected<SymbolRef::Type>
68XCOFFObjectFile::getSymbolType(DataRefImpl Symb) const {
69 llvm_unreachable("Not yet implemented!");
70 return SymbolRef::ST_Other;
71}
72
73Expected<section_iterator>
74XCOFFObjectFile::getSymbolSection(DataRefImpl Symb) const {
75 llvm_unreachable("Not yet implemented!");
76 return section_iterator(SectionRef());
77}
78
79void XCOFFObjectFile::moveSectionNext(DataRefImpl &Sec) const {
80 llvm_unreachable("Not yet implemented!");
81 return;
82}
83
84std::error_code XCOFFObjectFile::getSectionName(DataRefImpl Sec,
85 StringRef &Res) const {
86 llvm_unreachable("Not yet implemented!");
87 return std::error_code();
88}
89
90uint64_t XCOFFObjectFile::getSectionAddress(DataRefImpl Sec) const {
91 uint64_t Result = 0;
92 llvm_unreachable("Not yet implemented!");
93 return Result;
94}
95
96uint64_t XCOFFObjectFile::getSectionIndex(DataRefImpl Sec) const {
97 uint64_t Result = 0;
98 llvm_unreachable("Not yet implemented!");
99 return Result;
100}
101
102uint64_t XCOFFObjectFile::getSectionSize(DataRefImpl Sec) const {
103 uint64_t Result = 0;
104 llvm_unreachable("Not yet implemented!");
105 return Result;
106}
107
108std::error_code XCOFFObjectFile::getSectionContents(DataRefImpl Sec,
109 StringRef &Res) const {
110 llvm_unreachable("Not yet implemented!");
111 return std::error_code();
112}
113
114uint64_t XCOFFObjectFile::getSectionAlignment(DataRefImpl Sec) const {
115 uint64_t Result = 0;
116 llvm_unreachable("Not yet implemented!");
117 return Result;
118}
119
120bool XCOFFObjectFile::isSectionCompressed(DataRefImpl Sec) const {
121 bool Result = false;
122 llvm_unreachable("Not yet implemented!");
123 return Result;
124}
125
126bool XCOFFObjectFile::isSectionText(DataRefImpl Sec) const {
127 bool Result = false;
128 llvm_unreachable("Not yet implemented!");
129 return Result;
130}
131
132bool XCOFFObjectFile::isSectionData(DataRefImpl Sec) const {
133 bool Result = false;
134 llvm_unreachable("Not yet implemented!");
135 return Result;
136}
137
138bool XCOFFObjectFile::isSectionBSS(DataRefImpl Sec) const {
139 bool Result = false;
140 llvm_unreachable("Not yet implemented!");
141 return Result;
142}
143
144bool XCOFFObjectFile::isSectionVirtual(DataRefImpl Sec) const {
145 bool Result = false;
146 llvm_unreachable("Not yet implemented!");
147 return Result;
148}
149
150relocation_iterator XCOFFObjectFile::section_rel_begin(DataRefImpl Sec) const {
151 llvm_unreachable("Not yet implemented!");
152 return relocation_iterator(RelocationRef());
153}
154
155relocation_iterator XCOFFObjectFile::section_rel_end(DataRefImpl Sec) const {
156 llvm_unreachable("Not yet implemented!");
157 return relocation_iterator(RelocationRef());
158}
159
160void XCOFFObjectFile::moveRelocationNext(DataRefImpl &Rel) const {
161 llvm_unreachable("Not yet implemented!");
162 return;
163}
164
165uint64_t XCOFFObjectFile::getRelocationOffset(DataRefImpl Rel) const {
166 llvm_unreachable("Not yet implemented!");
167 uint64_t Result = 0;
168 return Result;
169}
170
171symbol_iterator XCOFFObjectFile::getRelocationSymbol(DataRefImpl Rel) const {
172 llvm_unreachable("Not yet implemented!");
173 return symbol_iterator(SymbolRef());
174}
175
176uint64_t XCOFFObjectFile::getRelocationType(DataRefImpl Rel) const {
177 llvm_unreachable("Not yet implemented!");
178 uint64_t Result = 0;
179 return Result;
180}
181
182void XCOFFObjectFile::getRelocationTypeName(
183 DataRefImpl Rel, SmallVectorImpl<char> &Result) const {
184 llvm_unreachable("Not yet implemented!");
185 return;
186}
187
188uint32_t XCOFFObjectFile::getSymbolFlags(DataRefImpl Symb) const {
189 uint32_t Result = 0;
190 llvm_unreachable("Not yet implemented!");
191 return Result;
192}
193
194basic_symbol_iterator XCOFFObjectFile::symbol_begin() const {
195 llvm_unreachable("Not yet implemented!");
196 return basic_symbol_iterator(SymbolRef());
197}
198
199basic_symbol_iterator XCOFFObjectFile::symbol_end() const {
200 llvm_unreachable("Not yet implemented!");
201 return basic_symbol_iterator(SymbolRef());
202}
203
204section_iterator XCOFFObjectFile::section_begin() const {
205 llvm_unreachable("Not yet implemented!");
206 return section_iterator(SectionRef());
207}
208
209section_iterator XCOFFObjectFile::section_end() const {
210 llvm_unreachable("Not yet implemented!");
211 return section_iterator(SectionRef());
212}
213
214uint8_t XCOFFObjectFile::getBytesInAddress() const {
215 uint8_t Result = 0;
216 llvm_unreachable("Not yet implemented!");
217 return Result;
218}
219
220StringRef XCOFFObjectFile::getFileFormatName() const {
221 llvm_unreachable("Not yet implemented!");
222 return "";
223}
224
225Triple::ArchType XCOFFObjectFile::getArch() const {
226 llvm_unreachable("Not yet implemented!");
227 return Triple::UnknownArch;
228}
229
230SubtargetFeatures XCOFFObjectFile::getFeatures() const {
231 llvm_unreachable("Not yet implemented!");
232 return SubtargetFeatures();
233}
234
235bool XCOFFObjectFile::isRelocatableObject() const {
236 bool Result = false;
237 llvm_unreachable("Not yet implemented!");
238 return Result;
239}
240
241XCOFFObjectFile::XCOFFObjectFile(MemoryBufferRef Object, std::error_code &EC)
242 : ObjectFile(Binary::ID_XCOFF32, Object) {
243
244 // Current location within the file.
245 uint64_t CurPtr = 0;
246
247 if ((EC = getObject(FileHdrPtr, Data, base() + CurPtr)))
248 return;
249}
250
251Expected<std::unique_ptr<ObjectFile>>
252ObjectFile::createXCOFFObjectFile(MemoryBufferRef Object) {
253 StringRef Data = Object.getBuffer();
254 file_magic Type = identify_magic(Data);
255 std::error_code EC;
256 std::unique_ptr<ObjectFile> Ret;
257
258 if (Type == file_magic::xcoff_object_32) {
259 Ret.reset(new XCOFFObjectFile(Object, EC));
260 } else {
261 llvm_unreachable("Encountered an unexpected binary file type!");
262 }
263
264 if (EC)
265 return errorCodeToError(EC);
266 return std::move(Ret);
267}
268
269} // namespace object
270} // namespace llvm