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