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