Binary.h revision 9f9ce61972871efcf794bdc6125835c2c32cd863
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 526f9489a86f33624f9ff5388411d12359ce9cef20David Meyer static inline unsigned int getELFType(bool isLittleEndian, bool is64Bits) { 536f9489a86f33624f9ff5388411d12359ce9cef20David Meyer if (isLittleEndian) 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; } 67001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer static inline bool classof(const Binary *v) { return true; } 686f9489a86f33624f9ff5388411d12359ce9cef20David Meyer 696f9489a86f33624f9ff5388411d12359ce9cef20David Meyer // Convenience methods 706f9489a86f33624f9ff5388411d12359ce9cef20David Meyer bool isObject() const { 716f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return TypeID > ID_StartObjects && TypeID < ID_EndObjects; 726f9489a86f33624f9ff5388411d12359ce9cef20David Meyer } 736f9489a86f33624f9ff5388411d12359ce9cef20David Meyer 746f9489a86f33624f9ff5388411d12359ce9cef20David Meyer bool isArchive() const { 756f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return TypeID == ID_Archive; 766f9489a86f33624f9ff5388411d12359ce9cef20David Meyer } 776f9489a86f33624f9ff5388411d12359ce9cef20David Meyer 786f9489a86f33624f9ff5388411d12359ce9cef20David Meyer bool isELF() const { 796f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return TypeID >= ID_ELF32L && TypeID <= ID_ELF64B; 806f9489a86f33624f9ff5388411d12359ce9cef20David Meyer } 816f9489a86f33624f9ff5388411d12359ce9cef20David Meyer 826f9489a86f33624f9ff5388411d12359ce9cef20David Meyer bool isMachO() const { 836f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return TypeID == ID_MachO; 846f9489a86f33624f9ff5388411d12359ce9cef20David Meyer } 856f9489a86f33624f9ff5388411d12359ce9cef20David Meyer 866f9489a86f33624f9ff5388411d12359ce9cef20David Meyer bool isCOFF() const { 876f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return TypeID == ID_COFF; 886f9489a86f33624f9ff5388411d12359ce9cef20David Meyer } 89c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer}; 90c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 91b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer/// @brief Create a Binary from Source, autodetecting the file type. 92b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer/// 93d9b0b025612992a0b724eeca8bdf10b1d7a5c355Benjamin Kramer/// @param Source The data to create the Binary from. Ownership is transferred 94b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer/// to Result if successful. If an error is returned, Source is destroyed 95b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer/// by createBinary before returning. 96b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer/// @param Result A pointer to the resulting Binary if no error occured. 97c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencererror_code createBinary(MemoryBuffer *Source, OwningPtr<Binary> &Result); 98b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer 99c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencererror_code createBinary(StringRef Path, OwningPtr<Binary> &Result); 100c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 101c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer} 102c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer} 103c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer 104c44c915372ee453bd63a8b6b3eca586ab6f18545Michael J. Spencer#endif 105