1c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer//===- Binary.h - A generic binary file -------------------------*- C++ -*-===// 2c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer// 3c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer// The LLVM Compiler Infrastructure 4c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer// 5c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer// This file is distributed under the University of Illinois Open Source 6c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer// License. See LICENSE.TXT for details. 7c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer// 8c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer//===----------------------------------------------------------------------===// 9c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer// 10c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer// This file declares the Binary class. 11c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer// 12c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer//===----------------------------------------------------------------------===// 13c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 14c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer#ifndef LLVM_OBJECT_BINARY_H 15c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer#define LLVM_OBJECT_BINARY_H 16c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 17c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer#include "llvm/ADT/OwningPtr.h" 18c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer#include "llvm/Object/Error.h" 19c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 20c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencernamespace llvm { 21c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 22c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencerclass MemoryBuffer; 23c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencerclass StringRef; 24c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 25c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencernamespace object { 26c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 27c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencerclass Binary { 28c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencerprivate: 299f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper Binary() LLVM_DELETED_FUNCTION; 309f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper Binary(const Binary &other) LLVM_DELETED_FUNCTION; 31c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 32c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer unsigned int TypeID; 33c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 34c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencerprotected: 35c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer MemoryBuffer *Data; 36c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 37c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer Binary(unsigned int Type, MemoryBuffer *Source); 38c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 39c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer enum { 406f9489a86f33624f9ff5388411d12359ce9cef20David Meyer ID_Archive, 41001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer // Object and children. 426f9489a86f33624f9ff5388411d12359ce9cef20David Meyer ID_StartObjects, 436f9489a86f33624f9ff5388411d12359ce9cef20David Meyer ID_COFF, 446f9489a86f33624f9ff5388411d12359ce9cef20David Meyer ID_ELF32L, // ELF 32-bit, little endian 456f9489a86f33624f9ff5388411d12359ce9cef20David Meyer ID_ELF32B, // ELF 32-bit, big endian 466f9489a86f33624f9ff5388411d12359ce9cef20David Meyer ID_ELF64L, // ELF 64-bit, little endian 476f9489a86f33624f9ff5388411d12359ce9cef20David Meyer ID_ELF64B, // ELF 64-bit, big endian 486f9489a86f33624f9ff5388411d12359ce9cef20David Meyer ID_MachO, 496f9489a86f33624f9ff5388411d12359ce9cef20David Meyer ID_EndObjects 50c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer }; 51c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 522af949ddddfaf2feb4a446c754e09d2d8c207ce4NAKAMURA Takumi static inline unsigned int getELFType(bool isLE, bool is64Bits) { 532af949ddddfaf2feb4a446c754e09d2d8c207ce4NAKAMURA Takumi if (isLE) 546f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return is64Bits ? ID_ELF64L : ID_ELF32L; 556f9489a86f33624f9ff5388411d12359ce9cef20David Meyer else 566f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return is64Bits ? ID_ELF64B : ID_ELF32B; 576f9489a86f33624f9ff5388411d12359ce9cef20David Meyer } 586f9489a86f33624f9ff5388411d12359ce9cef20David Meyer 59c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencerpublic: 60c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer virtual ~Binary(); 61c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 62c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer StringRef getData() const; 63c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer StringRef getFileName() const; 64c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 65c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer // Cast methods. 66c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer unsigned int getType() const { return TypeID; } 676f9489a86f33624f9ff5388411d12359ce9cef20David Meyer 686f9489a86f33624f9ff5388411d12359ce9cef20David Meyer // Convenience methods 696f9489a86f33624f9ff5388411d12359ce9cef20David Meyer bool isObject() const { 706f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return TypeID > ID_StartObjects && TypeID < ID_EndObjects; 716f9489a86f33624f9ff5388411d12359ce9cef20David Meyer } 726f9489a86f33624f9ff5388411d12359ce9cef20David Meyer 736f9489a86f33624f9ff5388411d12359ce9cef20David Meyer bool isArchive() const { 746f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return TypeID == ID_Archive; 756f9489a86f33624f9ff5388411d12359ce9cef20David Meyer } 766f9489a86f33624f9ff5388411d12359ce9cef20David Meyer 776f9489a86f33624f9ff5388411d12359ce9cef20David Meyer bool isELF() const { 786f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return TypeID >= ID_ELF32L && TypeID <= ID_ELF64B; 796f9489a86f33624f9ff5388411d12359ce9cef20David Meyer } 806f9489a86f33624f9ff5388411d12359ce9cef20David Meyer 816f9489a86f33624f9ff5388411d12359ce9cef20David Meyer bool isMachO() const { 826f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return TypeID == ID_MachO; 836f9489a86f33624f9ff5388411d12359ce9cef20David Meyer } 846f9489a86f33624f9ff5388411d12359ce9cef20David Meyer 856f9489a86f33624f9ff5388411d12359ce9cef20David Meyer bool isCOFF() const { 866f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return TypeID == ID_COFF; 876f9489a86f33624f9ff5388411d12359ce9cef20David Meyer } 882af949ddddfaf2feb4a446c754e09d2d8c207ce4NAKAMURA Takumi 892af949ddddfaf2feb4a446c754e09d2d8c207ce4NAKAMURA Takumi bool isLittleEndian() const { 902af949ddddfaf2feb4a446c754e09d2d8c207ce4NAKAMURA Takumi return !(TypeID == ID_ELF32B || TypeID == ID_ELF64B); 912af949ddddfaf2feb4a446c754e09d2d8c207ce4NAKAMURA Takumi } 92c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer}; 93c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 94b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer/// @brief Create a Binary from Source, autodetecting the file type. 95b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer/// 96d9b0b025612992a0b724eeca8bdf10b1d7a5c355Benjamin Kramer/// @param Source The data to create the Binary from. Ownership is transferred 97b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer/// to Result if successful. If an error is returned, Source is destroyed 98b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer/// by createBinary before returning. 99b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer/// @param Result A pointer to the resulting Binary if no error occured. 100c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencererror_code createBinary(MemoryBuffer *Source, OwningPtr<Binary> &Result); 101b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer 102c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencererror_code createBinary(StringRef Path, OwningPtr<Binary> &Result); 103c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 104c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer} 105c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer} 106c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 107c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer#endif 108