//===- MachO.h - MachO object file implementation ---------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares the MachOObjectFile class, which binds the MachOObject
// class to the generic ObjectFile wrapper.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_OBJECT_MACHO_H
#define LLVM_OBJECT_MACHO_H
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Object/MachOFormat.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/MachO.h"
#include "llvm/Support/raw_ostream.h"
namespace llvm {
namespace object {
using support::endianness;
template<endianness E, bool B>
struct MachOType {
static const endianness TargetEndianness = E;
static const bool Is64Bits = B;
};
template<endianness TargetEndianness>
struct MachODataTypeTypedefHelperCommon {
typedef support::detail::packed_endian_specific_integral
<uint16_t, TargetEndianness, support::unaligned> MachOInt16;
typedef support::detail::packed_endian_specific_integral
<uint32_t, TargetEndianness, support::unaligned> MachOInt32;
typedef support::detail::packed_endian_specific_integral
<uint64_t, TargetEndianness, support::unaligned> MachOInt64;
};
#define LLVM_MACHOB_IMPORT_TYPES(E) \
typedef typename MachODataTypeTypedefHelperCommon<E>::MachOInt16 MachOInt16; \
typedef typename MachODataTypeTypedefHelperCommon<E>::MachOInt32 MachOInt32; \
typedef typename MachODataTypeTypedefHelperCommon<E>::MachOInt64 MachOInt64;
template<class MachOT>
struct MachODataTypeTypedefHelper;
template<template<endianness, bool> class MachOT, endianness TargetEndianness>
struct MachODataTypeTypedefHelper<MachOT<TargetEndianness, false> > {
typedef MachODataTypeTypedefHelperCommon<TargetEndianness> Base;
typedef typename Base::MachOInt32 MachOIntPtr;
};
template<template<endianness, bool> class MachOT, endianness TargetEndianness>
struct MachODataTypeTypedefHelper<MachOT<TargetEndianness, true> > {
typedef MachODataTypeTypedefHelperCommon<TargetEndianness> Base;
typedef typename Base::MachOInt64 MachOIntPtr;
};
#define LLVM_MACHO_IMPORT_TYPES(MachOT, E, B) \
LLVM_MACHOB_IMPORT_TYPES(E) \
typedef typename \
MachODataTypeTypedefHelper <MachOT<E, B> >::MachOIntPtr MachOIntPtr;
namespace MachOFormat {
struct SectionBase {
char Name[16];
char SegmentName[16];
};
template<class MachOT>
struct Section;
template<template<endianness, bool> class MachOT, endianness TargetEndianness>
struct Section<MachOT<TargetEndianness, false> > {
LLVM_MACHOB_IMPORT_TYPES(TargetEndianness)
char Name[16];
char SegmentName[16];
MachOInt32 Address;
MachOInt32 Size;
MachOInt32 Offset;
MachOInt32 Align;
MachOInt32 RelocationTableOffset;
MachOInt32 NumRelocationTableEntries;
MachOInt32 Flags;
MachOInt32 Reserved1;
MachOInt32 Reserved2;
};
template<template<endianness, bool> class MachOT,
endianness TargetEndianness>
struct Section<MachOT<TargetEndianness, true> > {
LLVM_MACHOB_IMPORT_TYPES(TargetEndianness)
char Name[16];
char SegmentName[16];
MachOInt64 Address;
MachOInt64 Size;
MachOInt32 Offset;
MachOInt32 Align;
MachOInt32 RelocationTableOffset;
MachOInt32 NumRelocationTableEntries;
MachOInt32 Flags;
MachOInt32 Reserved1;
MachOInt32 Reserved2;
MachOInt32 Reserved3;
};
template<endianness TargetEndianness>
struct RelocationEntry {
LLVM_MACHOB_IMPORT_TYPES(TargetEndianness)
MachOInt32 Word0;
MachOInt32 Word1;
};
template<endianness TargetEndianness>
struct SymbolTableEntryBase {
LLVM_MACHOB_IMPORT_TYPES(TargetEndianness)
MachOInt32 StringIndex;
uint8_t Type;
uint8_t SectionIndex;
MachOInt16 Flags;
};
template<class MachOT>
struct SymbolTableEntry;
template<template<endianness, bool> class MachOT, endianness TargetEndianness,
bool Is64Bits>
struct SymbolTableEntry<MachOT<TargetEndianness, Is64Bits> > {
LLVM_MACHO_IMPORT_TYPES(MachOT, TargetEndianness, Is64Bits)
MachOInt32 StringIndex;
uint8_t Type;
uint8_t SectionIndex;
MachOInt16 Flags;
MachOIntPtr Value;
};
template<endianness Ta