xref: /llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp (revision ab2eb2bfacb4b2a3642e7716ddaf2638149aa0b4)
1 //===--- 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 
22 namespace llvm {
23 namespace object {
24 
25 // Sets Obj unless any bytes in [addr, addr + size) fall outsize of m.
26 // Returns unexpected_eof on error.
27 template <typename T>
28 static 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 
38 void XCOFFObjectFile::moveSymbolNext(DataRefImpl &Symb) const {
39   llvm_unreachable("Not yet implemented!");
40   return;
41 }
42 
43 Expected<StringRef> XCOFFObjectFile::getSymbolName(DataRefImpl Symb) const {
44   StringRef Result;
45   llvm_unreachable("Not yet implemented!");
46   return Result;
47 }
48 
49 Expected<uint64_t> XCOFFObjectFile::getSymbolAddress(DataRefImpl Symb) const {
50   uint64_t Result = 0;
51   llvm_unreachable("Not yet implemented!");
52   return Result;
53 }
54 
55 uint64_t XCOFFObjectFile::getSymbolValueImpl(DataRefImpl Symb) const {
56   uint64_t Result = 0;
57   llvm_unreachable("Not yet implemented!");
58   return Result;
59 }
60 
61 uint64_t XCOFFObjectFile::getCommonSymbolSizeImpl(DataRefImpl Symb) const {
62   uint64_t Result = 0;
63   llvm_unreachable("Not yet implemented!");
64   return Result;
65 }
66 
67 Expected<SymbolRef::Type>
68 XCOFFObjectFile::getSymbolType(DataRefImpl Symb) const {
69   llvm_unreachable("Not yet implemented!");
70   return SymbolRef::ST_Other;
71 }
72 
73 Expected<section_iterator>
74 XCOFFObjectFile::getSymbolSection(DataRefImpl Symb) const {
75   llvm_unreachable("Not yet implemented!");
76   return section_iterator(SectionRef());
77 }
78 
79 void XCOFFObjectFile::moveSectionNext(DataRefImpl &Sec) const {
80   llvm_unreachable("Not yet implemented!");
81   return;
82 }
83 
84 std::error_code XCOFFObjectFile::getSectionName(DataRefImpl Sec,
85                                                 StringRef &Res) const {
86   llvm_unreachable("Not yet implemented!");
87   return std::error_code();
88 }
89 
90 uint64_t XCOFFObjectFile::getSectionAddress(DataRefImpl Sec) const {
91   uint64_t Result = 0;
92   llvm_unreachable("Not yet implemented!");
93   return Result;
94 }
95 
96 uint64_t XCOFFObjectFile::getSectionIndex(DataRefImpl Sec) const {
97   uint64_t Result = 0;
98   llvm_unreachable("Not yet implemented!");
99   return Result;
100 }
101 
102 uint64_t XCOFFObjectFile::getSectionSize(DataRefImpl Sec) const {
103   uint64_t Result = 0;
104   llvm_unreachable("Not yet implemented!");
105   return Result;
106 }
107 
108 std::error_code XCOFFObjectFile::getSectionContents(DataRefImpl Sec,
109                                                     StringRef &Res) const {
110   llvm_unreachable("Not yet implemented!");
111   return std::error_code();
112 }
113 
114 uint64_t XCOFFObjectFile::getSectionAlignment(DataRefImpl Sec) const {
115   uint64_t Result = 0;
116   llvm_unreachable("Not yet implemented!");
117   return Result;
118 }
119 
120 bool XCOFFObjectFile::isSectionCompressed(DataRefImpl Sec) const {
121   bool Result = false;
122   llvm_unreachable("Not yet implemented!");
123   return Result;
124 }
125 
126 bool XCOFFObjectFile::isSectionText(DataRefImpl Sec) const {
127   bool Result = false;
128   llvm_unreachable("Not yet implemented!");
129   return Result;
130 }
131 
132 bool XCOFFObjectFile::isSectionData(DataRefImpl Sec) const {
133   bool Result = false;
134   llvm_unreachable("Not yet implemented!");
135   return Result;
136 }
137 
138 bool XCOFFObjectFile::isSectionBSS(DataRefImpl Sec) const {
139   bool Result = false;
140   llvm_unreachable("Not yet implemented!");
141   return Result;
142 }
143 
144 bool XCOFFObjectFile::isSectionVirtual(DataRefImpl Sec) const {
145   bool Result = false;
146   llvm_unreachable("Not yet implemented!");
147   return Result;
148 }
149 
150 relocation_iterator XCOFFObjectFile::section_rel_begin(DataRefImpl Sec) const {
151   llvm_unreachable("Not yet implemented!");
152   return relocation_iterator(RelocationRef());
153 }
154 
155 relocation_iterator XCOFFObjectFile::section_rel_end(DataRefImpl Sec) const {
156   llvm_unreachable("Not yet implemented!");
157   return relocation_iterator(RelocationRef());
158 }
159 
160 void XCOFFObjectFile::moveRelocationNext(DataRefImpl &Rel) const {
161   llvm_unreachable("Not yet implemented!");
162   return;
163 }
164 
165 uint64_t XCOFFObjectFile::getRelocationOffset(DataRefImpl Rel) const {
166   llvm_unreachable("Not yet implemented!");
167   uint64_t Result = 0;
168   return Result;
169 }
170 
171 symbol_iterator XCOFFObjectFile::getRelocationSymbol(DataRefImpl Rel) const {
172   llvm_unreachable("Not yet implemented!");
173   return symbol_iterator(SymbolRef());
174 }
175 
176 uint64_t XCOFFObjectFile::getRelocationType(DataRefImpl Rel) const {
177   llvm_unreachable("Not yet implemented!");
178   uint64_t Result = 0;
179   return Result;
180 }
181 
182 void XCOFFObjectFile::getRelocationTypeName(
183     DataRefImpl Rel, SmallVectorImpl<char> &Result) const {
184   llvm_unreachable("Not yet implemented!");
185   return;
186 }
187 
188 uint32_t XCOFFObjectFile::getSymbolFlags(DataRefImpl Symb) const {
189   uint32_t Result = 0;
190   llvm_unreachable("Not yet implemented!");
191   return Result;
192 }
193 
194 basic_symbol_iterator XCOFFObjectFile::symbol_begin() const {
195   llvm_unreachable("Not yet implemented!");
196   return basic_symbol_iterator(SymbolRef());
197 }
198 
199 basic_symbol_iterator XCOFFObjectFile::symbol_end() const {
200   llvm_unreachable("Not yet implemented!");
201   return basic_symbol_iterator(SymbolRef());
202 }
203 
204 section_iterator XCOFFObjectFile::section_begin() const {
205   llvm_unreachable("Not yet implemented!");
206   return section_iterator(SectionRef());
207 }
208 
209 section_iterator XCOFFObjectFile::section_end() const {
210   llvm_unreachable("Not yet implemented!");
211   return section_iterator(SectionRef());
212 }
213 
214 uint8_t XCOFFObjectFile::getBytesInAddress() const {
215   uint8_t Result = 0;
216   llvm_unreachable("Not yet implemented!");
217   return Result;
218 }
219 
220 StringRef XCOFFObjectFile::getFileFormatName() const {
221   llvm_unreachable("Not yet implemented!");
222   return "";
223 }
224 
225 Triple::ArchType XCOFFObjectFile::getArch() const {
226   llvm_unreachable("Not yet implemented!");
227   return Triple::UnknownArch;
228 }
229 
230 SubtargetFeatures XCOFFObjectFile::getFeatures() const {
231   llvm_unreachable("Not yet implemented!");
232   return SubtargetFeatures();
233 }
234 
235 bool XCOFFObjectFile::isRelocatableObject() const {
236   bool Result = false;
237   llvm_unreachable("Not yet implemented!");
238   return Result;
239 }
240 
241 XCOFFObjectFile::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 
251 Expected<std::unique_ptr<ObjectFile>>
252 ObjectFile::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
271