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