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