mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 00:11:00 +00:00
Revert "Fix the build broken by r189315." and "Move everything depending on Object/MachOFormat.h over to Support/MachO.h."
This reverts commits r189319 and r189315. r189315 broke some tests on what I believe are big-endian platforms. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189321 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
45fbe98c21
commit
f69a29b23a
@ -15,8 +15,8 @@
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCObjectWriter.h"
|
||||
#include "llvm/Object/MachOFormat.h"
|
||||
#include "llvm/Support/DataTypes.h"
|
||||
#include "llvm/Support/MachO.h"
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
@ -98,7 +98,7 @@ class MachObjectWriter : public MCObjectWriter {
|
||||
/// @{
|
||||
|
||||
llvm::DenseMap<const MCSectionData*,
|
||||
std::vector<MachO::any_relocation_info> > Relocations;
|
||||
std::vector<object::macho::RelocationEntry> > Relocations;
|
||||
llvm::DenseMap<const MCSectionData*, unsigned> IndirectSymBase;
|
||||
|
||||
/// @}
|
||||
@ -155,8 +155,9 @@ public:
|
||||
|
||||
bool is64Bit() const { return TargetObjectWriter->is64Bit(); }
|
||||
bool isARM() const {
|
||||
uint32_t CPUType = TargetObjectWriter->getCPUType() & ~MachO::CPU_ARCH_MASK;
|
||||
return CPUType == MachO::CPU_TYPE_ARM;
|
||||
uint32_t CPUType = TargetObjectWriter->getCPUType() &
|
||||
~object::mach::CTFM_ArchMask;
|
||||
return CPUType == object::mach::CTM_ARM;
|
||||
}
|
||||
|
||||
/// @}
|
||||
@ -212,21 +213,7 @@ public:
|
||||
// these through in many cases.
|
||||
|
||||
void addRelocation(const MCSectionData *SD,
|
||||
MachO::relocation_info &MRE) {
|
||||
MachO::any_relocation_info AMRE;
|
||||
memcpy(&AMRE, &MRE, sizeof(MRE));
|
||||
Relocations[SD].push_back(AMRE);
|
||||
}
|
||||
|
||||
void addRelocation(const MCSectionData *SD,
|
||||
MachO::scattered_relocation_info &SMRE) {
|
||||
MachO::any_relocation_info MRE;
|
||||
memcpy(&MRE, &SMRE, sizeof(MRE));
|
||||
Relocations[SD].push_back(MRE);
|
||||
}
|
||||
|
||||
void addRelocation(const MCSectionData *SD,
|
||||
MachO::any_relocation_info &MRE) {
|
||||
object::macho::RelocationEntry &MRE) {
|
||||
Relocations[SD].push_back(MRE);
|
||||
}
|
||||
|
||||
|
@ -18,8 +18,8 @@
|
||||
#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/MachO.h"
|
||||
|
||||
namespace llvm {
|
||||
namespace object {
|
||||
@ -53,7 +53,7 @@ class MachOObjectFile : public ObjectFile {
|
||||
public:
|
||||
struct LoadCommandInfo {
|
||||
const char *Ptr; // Where in memory the load command is.
|
||||
MachO::load_command C; // The command itself.
|
||||
macho::LoadCommand C; // The command itself.
|
||||
};
|
||||
|
||||
MachOObjectFile(MemoryBuffer *Object, bool IsLittleEndian, bool Is64Bits,
|
||||
@ -146,53 +146,50 @@ public:
|
||||
ArrayRef<char> getSectionRawFinalSegmentName(DataRefImpl Sec) const;
|
||||
|
||||
// MachO specific Info about relocations.
|
||||
bool isRelocationScattered(const MachO::any_relocation_info &RE) const;
|
||||
unsigned getPlainRelocationSymbolNum(
|
||||
const MachO::any_relocation_info &RE) const;
|
||||
bool getPlainRelocationExternal(const MachO::any_relocation_info &RE) const;
|
||||
bool getScatteredRelocationScattered(
|
||||
const MachO::any_relocation_info &RE) const;
|
||||
uint32_t getScatteredRelocationValue(
|
||||
const MachO::any_relocation_info &RE) const;
|
||||
unsigned getAnyRelocationAddress(const MachO::any_relocation_info &RE) const;
|
||||
unsigned getAnyRelocationPCRel(const MachO::any_relocation_info &RE) const;
|
||||
unsigned getAnyRelocationLength(const MachO::any_relocation_info &RE) const;
|
||||
unsigned getAnyRelocationType(const MachO::any_relocation_info &RE) const;
|
||||
SectionRef getRelocationSection(const MachO::any_relocation_info &RE) const;
|
||||
bool isRelocationScattered(const macho::RelocationEntry &RE) const;
|
||||
unsigned getPlainRelocationSymbolNum(const macho::RelocationEntry &RE) const;
|
||||
bool getPlainRelocationExternal(const macho::RelocationEntry &RE) const;
|
||||
bool getScatteredRelocationScattered(const macho::RelocationEntry &RE) const;
|
||||
uint32_t getScatteredRelocationValue(const macho::RelocationEntry &RE) const;
|
||||
unsigned getAnyRelocationAddress(const macho::RelocationEntry &RE) const;
|
||||
unsigned getAnyRelocationPCRel(const macho::RelocationEntry &RE) const;
|
||||
unsigned getAnyRelocationLength(const macho::RelocationEntry &RE) const;
|
||||
unsigned getAnyRelocationType(const macho::RelocationEntry &RE) const;
|
||||
SectionRef getRelocationSection(const macho::RelocationEntry &RE) const;
|
||||
|
||||
// Walk load commands.
|
||||
LoadCommandInfo getFirstLoadCommandInfo() const;
|
||||
LoadCommandInfo getNextLoadCommandInfo(const LoadCommandInfo &L) const;
|
||||
|
||||
// MachO specific structures.
|
||||
MachO::section getSection(DataRefImpl DRI) const;
|
||||
MachO::section_64 getSection64(DataRefImpl DRI) const;
|
||||
MachO::section getSection(const LoadCommandInfo &L, unsigned Index) const;
|
||||
MachO::section_64 getSection64(const LoadCommandInfo &L,unsigned Index) const;
|
||||
MachO::nlist getSymbolTableEntry(DataRefImpl DRI) const;
|
||||
MachO::nlist_64 getSymbol64TableEntry(DataRefImpl DRI) const;
|
||||
macho::Section getSection(DataRefImpl DRI) const;
|
||||
macho::Section64 getSection64(DataRefImpl DRI) const;
|
||||
macho::Section getSection(const LoadCommandInfo &L, unsigned Index) const;
|
||||
macho::Section64 getSection64(const LoadCommandInfo &L, unsigned Index) const;
|
||||
macho::SymbolTableEntry getSymbolTableEntry(DataRefImpl DRI) const;
|
||||
macho::Symbol64TableEntry getSymbol64TableEntry(DataRefImpl DRI) const;
|
||||
|
||||
MachO::linkedit_data_command
|
||||
macho::LinkeditDataLoadCommand
|
||||
getLinkeditDataLoadCommand(const LoadCommandInfo &L) const;
|
||||
MachO::segment_command
|
||||
macho::SegmentLoadCommand
|
||||
getSegmentLoadCommand(const LoadCommandInfo &L) const;
|
||||
MachO::segment_command_64
|
||||
macho::Segment64LoadCommand
|
||||
getSegment64LoadCommand(const LoadCommandInfo &L) const;
|
||||
MachO::linker_options_command
|
||||
macho::LinkerOptionsLoadCommand
|
||||
getLinkerOptionsLoadCommand(const LoadCommandInfo &L) const;
|
||||
|
||||
MachO::any_relocation_info getRelocation(DataRefImpl Rel) const;
|
||||
MachO::data_in_code_entry getDice(DataRefImpl Rel) const;
|
||||
MachO::mach_header getHeader() const;
|
||||
MachO::mach_header_64 getHeader64() const;
|
||||
uint32_t
|
||||
getIndirectSymbolTableEntry(const MachO::dysymtab_command &DLC,
|
||||
macho::RelocationEntry getRelocation(DataRefImpl Rel) const;
|
||||
macho::DataInCodeTableEntry getDice(DataRefImpl Rel) const;
|
||||
macho::Header getHeader() const;
|
||||
macho::Header64Ext getHeader64Ext() const;
|
||||
macho::IndirectSymbolTableEntry
|
||||
getIndirectSymbolTableEntry(const macho::DysymtabLoadCommand &DLC,
|
||||
unsigned Index) const;
|
||||
MachO::data_in_code_entry getDataInCodeTableEntry(uint32_t DataOffset,
|
||||
unsigned Index) const;
|
||||
MachO::symtab_command getSymtabLoadCommand() const;
|
||||
MachO::dysymtab_command getDysymtabLoadCommand() const;
|
||||
MachO::linkedit_data_command getDataInCodeLoadCommand() const;
|
||||
macho::DataInCodeTableEntry getDataInCodeTableEntry(uint32_t DataOffset,
|
||||
unsigned Index) const;
|
||||
macho::SymtabLoadCommand getSymtabLoadCommand() const;
|
||||
macho::DysymtabLoadCommand getDysymtabLoadCommand() const;
|
||||
macho::LinkeditDataLoadCommand getDataInCodeLoadCommand() const;
|
||||
|
||||
StringRef getStringTableData() const;
|
||||
bool is64Bit() const;
|
||||
@ -226,8 +223,8 @@ inline bool DiceRef::operator<(const DiceRef &Other) const {
|
||||
|
||||
inline error_code DiceRef::getNext(DiceRef &Result) const {
|
||||
DataRefImpl Rel = DicePimpl;
|
||||
const MachO::data_in_code_entry *P =
|
||||
reinterpret_cast<const MachO::data_in_code_entry *>(Rel.p);
|
||||
const macho::DataInCodeTableEntry *P =
|
||||
reinterpret_cast<const macho::DataInCodeTableEntry *>(Rel.p);
|
||||
Rel.p = reinterpret_cast<uintptr_t>(P + 1);
|
||||
Result = DiceRef(Rel, OwningObject);
|
||||
return object_error::success;
|
||||
@ -240,24 +237,24 @@ inline error_code DiceRef::getNext(DiceRef &Result) const {
|
||||
inline error_code DiceRef::getOffset(uint32_t &Result) const {
|
||||
const MachOObjectFile *MachOOF =
|
||||
static_cast<const MachOObjectFile *>(OwningObject);
|
||||
MachO::data_in_code_entry Dice = MachOOF->getDice(DicePimpl);
|
||||
Result = Dice.offset;
|
||||
macho::DataInCodeTableEntry Dice = MachOOF->getDice(DicePimpl);
|
||||
Result = Dice.Offset;
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
inline error_code DiceRef::getLength(uint16_t &Result) const {
|
||||
const MachOObjectFile *MachOOF =
|
||||
static_cast<const MachOObjectFile *>(OwningObject);
|
||||
MachO::data_in_code_entry Dice = MachOOF->getDice(DicePimpl);
|
||||
Result = Dice.length;
|
||||
macho::DataInCodeTableEntry Dice = MachOOF->getDice(DicePimpl);
|
||||
Result = Dice.Length;
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
inline error_code DiceRef::getKind(uint16_t &Result) const {
|
||||
const MachOObjectFile *MachOOF =
|
||||
static_cast<const MachOObjectFile *>(OwningObject);
|
||||
MachO::data_in_code_entry Dice = MachOOF->getDice(DicePimpl);
|
||||
Result = Dice.kind;
|
||||
macho::DataInCodeTableEntry Dice = MachOOF->getDice(DicePimpl);
|
||||
Result = Dice.Kind;
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
|
452
include/llvm/Object/MachOFormat.h
Normal file
452
include/llvm/Object/MachOFormat.h
Normal file
@ -0,0 +1,452 @@
|
||||
//===- MachOFormat.h - Mach-O Format Structures And Constants ---*- 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 various structures and constants which are platform
|
||||
// independent and can be shared by any client which wishes to interact with
|
||||
// Mach object files.
|
||||
//
|
||||
// The definitions here are purposely chosen to match the LLVM style as opposed
|
||||
// to following the platform specific definition of the format.
|
||||
//
|
||||
// On a Mach system, see the <mach-o/...> includes for more information, in
|
||||
// particular <mach-o/loader.h>.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_OBJECT_MACHOFORMAT_H
|
||||
#define LLVM_OBJECT_MACHOFORMAT_H
|
||||
|
||||
#include "llvm/Support/DataTypes.h"
|
||||
|
||||
namespace llvm {
|
||||
namespace object {
|
||||
|
||||
/// General Mach platform information.
|
||||
namespace mach {
|
||||
/// @name CPU Type and Subtype Information
|
||||
/// {
|
||||
|
||||
/// \brief Capability bits used in CPU type encoding.
|
||||
enum CPUTypeFlagsMask {
|
||||
CTFM_ArchMask = 0xFF000000,
|
||||
CTFM_ArchABI64 = 0x01000000
|
||||
};
|
||||
|
||||
/// \brief Machine type IDs used in CPU type encoding.
|
||||
enum CPUTypeMachine {
|
||||
CTM_i386 = 7,
|
||||
CTM_x86_64 = CTM_i386 | CTFM_ArchABI64,
|
||||
CTM_ARM = 12,
|
||||
CTM_SPARC = 14,
|
||||
CTM_PowerPC = 18,
|
||||
CTM_PowerPC64 = CTM_PowerPC | CTFM_ArchABI64
|
||||
};
|
||||
|
||||
/// \brief Capability bits used in CPU subtype encoding.
|
||||
enum CPUSubtypeFlagsMask {
|
||||
CSFM_SubtypeMask = 0xFF000000,
|
||||
CSFM_SubtypeLib64 = 0x80000000
|
||||
};
|
||||
|
||||
/// \brief ARM Machine Subtypes.
|
||||
enum CPUSubtypeARM {
|
||||
CSARM_ALL = 0,
|
||||
CSARM_V4T = 5,
|
||||
CSARM_V6 = 6,
|
||||
CSARM_V5TEJ = 7,
|
||||
CSARM_XSCALE = 8,
|
||||
CSARM_V7 = 9,
|
||||
CSARM_V7F = 10,
|
||||
CSARM_V7S = 11,
|
||||
CSARM_V7K = 12,
|
||||
CSARM_V6M = 14,
|
||||
CSARM_V7M = 15,
|
||||
CSARM_V7EM = 16
|
||||
};
|
||||
|
||||
/// \brief PowerPC Machine Subtypes.
|
||||
enum CPUSubtypePowerPC {
|
||||
CSPPC_ALL = 0
|
||||
};
|
||||
|
||||
/// \brief SPARC Machine Subtypes.
|
||||
enum CPUSubtypeSPARC {
|
||||
CSSPARC_ALL = 0
|
||||
};
|
||||
|
||||
/// \brief x86 Machine Subtypes.
|
||||
enum CPUSubtypeX86 {
|
||||
CSX86_ALL = 3
|
||||
};
|
||||
|
||||
/// @}
|
||||
|
||||
} // end namespace mach
|
||||
|
||||
/// Format information for Mach object files.
|
||||
namespace macho {
|
||||
/// \brief Constants for structure sizes.
|
||||
enum StructureSizes {
|
||||
Header32Size = 28,
|
||||
Header64Size = 32,
|
||||
FatHeaderSize = 8,
|
||||
FatArchHeaderSize = 20,
|
||||
SegmentLoadCommand32Size = 56,
|
||||
SegmentLoadCommand64Size = 72,
|
||||
Section32Size = 68,
|
||||
Section64Size = 80,
|
||||
SymtabLoadCommandSize = 24,
|
||||
DysymtabLoadCommandSize = 80,
|
||||
Nlist32Size = 12,
|
||||
Nlist64Size = 16,
|
||||
RelocationInfoSize = 8,
|
||||
LinkeditLoadCommandSize = 16
|
||||
};
|
||||
|
||||
/// \brief Constants for header magic field.
|
||||
enum HeaderMagic {
|
||||
HM_Object32 = 0xFEEDFACE, ///< 32-bit mach object file
|
||||
HM_Object64 = 0xFEEDFACF, ///< 64-bit mach object file
|
||||
HM_Universal = 0xCAFEBABE ///< Universal object file
|
||||
};
|
||||
|
||||
/// \brief Header common to all Mach object files.
|
||||
struct Header {
|
||||
uint32_t Magic;
|
||||
uint32_t CPUType;
|
||||
uint32_t CPUSubtype;
|
||||
uint32_t FileType;
|
||||
uint32_t NumLoadCommands;
|
||||
uint32_t SizeOfLoadCommands;
|
||||
uint32_t Flags;
|
||||
};
|
||||
|
||||
/// \brief Extended header for 64-bit object files.
|
||||
struct Header64Ext {
|
||||
uint32_t Reserved;
|
||||
};
|
||||
|
||||
/// \brief Header for universal object files.
|
||||
struct FatHeader {
|
||||
uint32_t Magic;
|
||||
uint32_t NumFatArch;
|
||||
};
|
||||
|
||||
/// \brief Header for a single-architecture object file in a
|
||||
/// universal binary.
|
||||
struct FatArchHeader {
|
||||
uint32_t CPUType;
|
||||
uint32_t CPUSubtype;
|
||||
uint32_t Offset;
|
||||
uint32_t Size;
|
||||
uint32_t Align;
|
||||
};
|
||||
|
||||
// See <mach-o/loader.h>.
|
||||
enum HeaderFileType {
|
||||
HFT_Object = 0x1
|
||||
};
|
||||
|
||||
enum HeaderFlags {
|
||||
HF_SubsectionsViaSymbols = 0x2000
|
||||
};
|
||||
|
||||
enum LoadCommandType {
|
||||
LCT_Segment = 0x1,
|
||||
LCT_Symtab = 0x2,
|
||||
LCT_Dysymtab = 0xb,
|
||||
LCT_Segment64 = 0x19,
|
||||
LCT_UUID = 0x1b,
|
||||
LCT_CodeSignature = 0x1d,
|
||||
LCT_SegmentSplitInfo = 0x1e,
|
||||
LCT_FunctionStarts = 0x26,
|
||||
LCT_DataInCode = 0x29,
|
||||
LCT_LinkerOptions = 0x2D
|
||||
};
|
||||
|
||||
/// \brief Load command structure.
|
||||
struct LoadCommand {
|
||||
uint32_t Type;
|
||||
uint32_t Size;
|
||||
};
|
||||
|
||||
/// @name Load Command Structures
|
||||
/// @{
|
||||
|
||||
struct SegmentLoadCommand {
|
||||
uint32_t Type;
|
||||
uint32_t Size;
|
||||
char Name[16];
|
||||
uint32_t VMAddress;
|
||||
uint32_t VMSize;
|
||||
uint32_t FileOffset;
|
||||
uint32_t FileSize;
|
||||
uint32_t MaxVMProtection;
|
||||
uint32_t InitialVMProtection;
|
||||
uint32_t NumSections;
|
||||
uint32_t Flags;
|
||||
};
|
||||
|
||||
struct Segment64LoadCommand {
|
||||
uint32_t Type;
|
||||
uint32_t Size;
|
||||
char Name[16];
|
||||
uint64_t VMAddress;
|
||||
uint64_t VMSize;
|
||||
uint64_t FileOffset;
|
||||
uint64_t FileSize;
|
||||
uint32_t MaxVMProtection;
|
||||
uint32_t InitialVMProtection;
|
||||
uint32_t NumSections;
|
||||
uint32_t Flags;
|
||||
};
|
||||
|
||||
struct SymtabLoadCommand {
|
||||
uint32_t Type;
|
||||
uint32_t Size;
|
||||
uint32_t SymbolTableOffset;
|
||||
uint32_t NumSymbolTableEntries;
|
||||
uint32_t StringTableOffset;
|
||||
uint32_t StringTableSize;
|
||||
};
|
||||
|
||||
struct DysymtabLoadCommand {
|
||||
uint32_t Type;
|
||||
uint32_t Size;
|
||||
|
||||
uint32_t LocalSymbolsIndex;
|
||||
uint32_t NumLocalSymbols;
|
||||
|
||||
uint32_t ExternalSymbolsIndex;
|
||||
uint32_t NumExternalSymbols;
|
||||
|
||||
uint32_t UndefinedSymbolsIndex;
|
||||
uint32_t NumUndefinedSymbols;
|
||||
|
||||
uint32_t TOCOffset;
|
||||
uint32_t NumTOCEntries;
|
||||
|
||||
uint32_t ModuleTableOffset;
|
||||
uint32_t NumModuleTableEntries;
|
||||
|
||||
uint32_t ReferenceSymbolTableOffset;
|
||||
uint32_t NumReferencedSymbolTableEntries;
|
||||
|
||||
uint32_t IndirectSymbolTableOffset;
|
||||
uint32_t NumIndirectSymbolTableEntries;
|
||||
|
||||
uint32_t ExternalRelocationTableOffset;
|
||||
uint32_t NumExternalRelocationTableEntries;
|
||||
|
||||
uint32_t LocalRelocationTableOffset;
|
||||
uint32_t NumLocalRelocationTableEntries;
|
||||
};
|
||||
|
||||
struct LinkeditDataLoadCommand {
|
||||
uint32_t Type;
|
||||
uint32_t Size;
|
||||
uint32_t DataOffset;
|
||||
uint32_t DataSize;
|
||||
};
|
||||
|
||||
struct LinkerOptionsLoadCommand {
|
||||
uint32_t Type;
|
||||
uint32_t Size;
|
||||
uint32_t Count;
|
||||
// Load command is followed by Count number of zero-terminated UTF8 strings,
|
||||
// and then zero-filled to be 4-byte aligned.
|
||||
};
|
||||
|
||||
/// @}
|
||||
/// @name Section Data
|
||||
/// @{
|
||||
|
||||
enum SectionFlags {
|
||||
SF_PureInstructions = 0x80000000
|
||||
};
|
||||
|
||||
struct Section {
|
||||
char Name[16];
|
||||
char SegmentName[16];
|
||||
uint32_t Address;
|
||||
uint32_t Size;
|
||||
uint32_t Offset;
|
||||
uint32_t Align;
|
||||
uint32_t RelocationTableOffset;
|
||||
uint32_t NumRelocationTableEntries;
|
||||
uint32_t Flags;
|
||||
uint32_t Reserved1;
|
||||
uint32_t Reserved2;
|
||||
};
|
||||
struct Section64 {
|
||||
char Name[16];
|
||||
char SegmentName[16];
|
||||
uint64_t Address;
|
||||
uint64_t Size;
|
||||
uint32_t Offset;
|
||||
uint32_t Align;
|
||||
uint32_t RelocationTableOffset;
|
||||
uint32_t NumRelocationTableEntries;
|
||||
uint32_t Flags;
|
||||
uint32_t Reserved1;
|
||||
uint32_t Reserved2;
|
||||
uint32_t Reserved3;
|
||||
};
|
||||
|
||||
/// @}
|
||||
/// @name Symbol Table Entries
|
||||
/// @{
|
||||
|
||||
struct SymbolTableEntry {
|
||||
uint32_t StringIndex;
|
||||
uint8_t Type;
|
||||
uint8_t SectionIndex;
|
||||
uint16_t Flags;
|
||||
uint32_t Value;
|
||||
};
|
||||
// Despite containing a uint64_t, this structure is only 4-byte aligned within
|
||||
// a MachO file.
|
||||
#pragma pack(push)
|
||||
#pragma pack(4)
|
||||
struct Symbol64TableEntry {
|
||||
uint32_t StringIndex;
|
||||
uint8_t Type;
|
||||
uint8_t SectionIndex;
|
||||
uint16_t Flags;
|
||||
uint64_t Value;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
/// @}
|
||||
/// @name Data-in-code Table Entry
|
||||
/// @{
|
||||
|
||||
// See <mach-o/loader.h>.
|
||||
enum DataRegionType { Data = 1, JumpTable8, JumpTable16, JumpTable32 };
|
||||
struct DataInCodeTableEntry {
|
||||
uint32_t Offset; /* from mach_header to start of data region */
|
||||
uint16_t Length; /* number of bytes in data region */
|
||||
uint16_t Kind; /* a DataRegionType value */
|
||||
};
|
||||
|
||||
/// @}
|
||||
/// @name Indirect Symbol Table
|
||||
/// @{
|
||||
|
||||
struct IndirectSymbolTableEntry {
|
||||
uint32_t Index;
|
||||
};
|
||||
|
||||
/// @}
|
||||
/// @name Relocation Data
|
||||
/// @{
|
||||
|
||||
struct RelocationEntry {
|
||||
uint32_t Word0;
|
||||
uint32_t Word1;
|
||||
};
|
||||
|
||||
/// @}
|
||||
|
||||
// See <mach-o/nlist.h>.
|
||||
enum SymbolTypeType {
|
||||
STT_Undefined = 0x00,
|
||||
STT_Absolute = 0x02,
|
||||
STT_Section = 0x0e
|
||||
};
|
||||
|
||||
enum SymbolTypeFlags {
|
||||
// If any of these bits are set, then the entry is a stab entry number (see
|
||||
// <mach-o/stab.h>. Otherwise the other masks apply.
|
||||
STF_StabsEntryMask = 0xe0,
|
||||
|
||||
STF_TypeMask = 0x0e,
|
||||
STF_External = 0x01,
|
||||
STF_PrivateExtern = 0x10
|
||||
};
|
||||
|
||||
/// IndirectSymbolFlags - Flags for encoding special values in the indirect
|
||||
/// symbol entry.
|
||||
enum IndirectSymbolFlags {
|
||||
ISF_Local = 0x80000000,
|
||||
ISF_Absolute = 0x40000000
|
||||
};
|
||||
|
||||
/// RelocationFlags - Special flags for addresses.
|
||||
enum RelocationFlags {
|
||||
RF_Scattered = 0x80000000
|
||||
};
|
||||
|
||||
/// Common relocation info types.
|
||||
enum RelocationInfoType {
|
||||
RIT_Vanilla = 0,
|
||||
RIT_Pair = 1,
|
||||
RIT_Difference = 2
|
||||
};
|
||||
|
||||
/// Generic relocation info types, which are shared by some (but not all)
|
||||
/// platforms.
|
||||
enum RelocationInfoType_Generic {
|
||||
RIT_Generic_PreboundLazyPointer = 3,
|
||||
RIT_Generic_LocalDifference = 4,
|
||||
RIT_Generic_TLV = 5
|
||||
};
|
||||
|
||||
/// X86_64 uses its own relocation types.
|
||||
enum RelocationInfoTypeX86_64 {
|
||||
// Note that x86_64 doesn't even share the common relocation types.
|
||||
RIT_X86_64_Unsigned = 0,
|
||||
RIT_X86_64_Signed = 1,
|
||||
RIT_X86_64_Branch = 2,
|
||||
RIT_X86_64_GOTLoad = 3,
|
||||
RIT_X86_64_GOT = 4,
|
||||
RIT_X86_64_Subtractor = 5,
|
||||
RIT_X86_64_Signed1 = 6,
|
||||
RIT_X86_64_Signed2 = 7,
|
||||
RIT_X86_64_Signed4 = 8,
|
||||
RIT_X86_64_TLV = 9
|
||||
};
|
||||
|
||||
/// ARM uses its own relocation types.
|
||||
enum RelocationInfoTypeARM {
|
||||
RIT_ARM_LocalDifference = 3,
|
||||
RIT_ARM_PreboundLazyPointer = 4,
|
||||
RIT_ARM_Branch24Bit = 5,
|
||||
RIT_ARM_ThumbBranch22Bit = 6,
|
||||
RIT_ARM_ThumbBranch32Bit = 7,
|
||||
RIT_ARM_Half = 8,
|
||||
RIT_ARM_HalfDifference = 9
|
||||
|
||||
};
|
||||
|
||||
/// PPC relocation types from <mach-o/ppc/reloc.h>
|
||||
enum RelocationInfoTypePPC {
|
||||
RIT_PPC_BR14 = RIT_Pair +1,
|
||||
RIT_PPC_BR24,
|
||||
RIT_PPC_HI16,
|
||||
RIT_PPC_LO16,
|
||||
RIT_PPC_HA16,
|
||||
RIT_PPC_LO14,
|
||||
RIT_PPC_SECTDIFF,
|
||||
RIT_PPC_PB_LA_PTR,
|
||||
RIT_PPC_HI16_SECTDIFF,
|
||||
RIT_PPC_LO16_SECTDIFF,
|
||||
RIT_PPC_HA16_SECTDIFF,
|
||||
RIT_PPC_JBSR,
|
||||
RIT_PPC_LO14_SECTDIFF,
|
||||
RIT_PPC_LOCAL_SECTDIFF,
|
||||
RIT_PPC_TLV
|
||||
};
|
||||
|
||||
} // end namespace macho
|
||||
|
||||
} // end namespace object
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
@ -18,7 +18,7 @@
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
#include "llvm/Object/Binary.h"
|
||||
#include "llvm/Support/MachO.h"
|
||||
#include "llvm/Object/MachOFormat.h"
|
||||
|
||||
namespace llvm {
|
||||
namespace object {
|
||||
@ -35,7 +35,7 @@ public:
|
||||
/// \brief Index of object in the universal binary.
|
||||
uint32_t Index;
|
||||
/// \brief Descriptor of the object.
|
||||
MachO::fat_arch Header;
|
||||
macho::FatArchHeader Header;
|
||||
|
||||
public:
|
||||
ObjectForArch(const MachOUniversalBinary *Parent, uint32_t Index);
|
||||
@ -50,7 +50,7 @@ public:
|
||||
}
|
||||
|
||||
ObjectForArch getNext() const { return ObjectForArch(Parent, Index + 1); }
|
||||
uint32_t getCPUType() const { return Header.cputype; }
|
||||
uint32_t getCPUType() const { return Header.CPUType; }
|
||||
|
||||
error_code getAsObjectFile(OwningPtr<ObjectFile> &Result) const;
|
||||
};
|
||||
|
@ -180,7 +180,7 @@ bool RuntimeDyldMachO::resolveI386Relocation(uint8_t *LocalAddress,
|
||||
switch (Type) {
|
||||
default:
|
||||
llvm_unreachable("Invalid relocation type!");
|
||||
case MachO::GENERIC_RELOC_VANILLA: {
|
||||
case macho::RIT_Vanilla: {
|
||||
uint8_t *p = LocalAddress;
|
||||
uint64_t ValueToWrite = Value + Addend;
|
||||
for (unsigned i = 0; i < Size; ++i) {
|
||||
@ -189,9 +189,9 @@ bool RuntimeDyldMachO::resolveI386Relocation(uint8_t *LocalAddress,
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case MachO::GENERIC_RELOC_SECTDIFF:
|
||||
case MachO::GENERIC_RELOC_LOCAL_SECTDIFF:
|
||||
case MachO::GENERIC_RELOC_PB_LA_PTR:
|
||||
case macho::RIT_Difference:
|
||||
case macho::RIT_Generic_LocalDifference:
|
||||
case macho::RIT_Generic_PreboundLazyPointer:
|
||||
return Error("Relocation type not implemented yet!");
|
||||
}
|
||||
}
|
||||
@ -213,12 +213,12 @@ bool RuntimeDyldMachO::resolveX86_64Relocation(uint8_t *LocalAddress,
|
||||
switch(Type) {
|
||||
default:
|
||||
llvm_unreachable("Invalid relocation type!");
|
||||
case MachO::X86_64_RELOC_SIGNED_1:
|
||||
case MachO::X86_64_RELOC_SIGNED_2:
|
||||
case MachO::X86_64_RELOC_SIGNED_4:
|
||||
case MachO::X86_64_RELOC_SIGNED:
|
||||
case MachO::X86_64_RELOC_UNSIGNED:
|
||||
case MachO::X86_64_RELOC_BRANCH: {
|
||||
case macho::RIT_X86_64_Signed1:
|
||||
case macho::RIT_X86_64_Signed2:
|
||||
case macho::RIT_X86_64_Signed4:
|
||||
case macho::RIT_X86_64_Signed:
|
||||
case macho::RIT_X86_64_Unsigned:
|
||||
case macho::RIT_X86_64_Branch: {
|
||||
Value += Addend;
|
||||
// Mask in the target value a byte at a time (we don't have an alignment
|
||||
// guarantee for the target address, so this is safest).
|
||||
@ -229,10 +229,10 @@ bool RuntimeDyldMachO::resolveX86_64Relocation(uint8_t *LocalAddress,
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case MachO::X86_64_RELOC_GOT_LOAD:
|
||||
case MachO::X86_64_RELOC_GOT:
|
||||
case MachO::X86_64_RELOC_SUBTRACTOR:
|
||||
case MachO::X86_64_RELOC_TLV:
|
||||
case macho::RIT_X86_64_GOTLoad:
|
||||
case macho::RIT_X86_64_GOT:
|
||||
case macho::RIT_X86_64_Subtractor:
|
||||
case macho::RIT_X86_64_TLV:
|
||||
return Error("Relocation type not implemented yet!");
|
||||
}
|
||||
}
|
||||
@ -257,17 +257,17 @@ bool RuntimeDyldMachO::resolveARMRelocation(uint8_t *LocalAddress,
|
||||
switch(Type) {
|
||||
default:
|
||||
llvm_unreachable("Invalid relocation type!");
|
||||
case MachO::ARM_RELOC_VANILLA: {
|
||||
case macho::RIT_Vanilla: {
|
||||
// Mask in the target value a byte at a time (we don't have an alignment
|
||||
// guarantee for the target address, so this is safest).
|
||||
uint8_t *p = (uint8_t*)LocalAddress;
|
||||
for (unsigned i = 0; i < Size; ++i) {
|
||||
*p++ = (uint8_t)(Value & 0xff);
|
||||
*p++ = (uint8_t)Value;
|
||||
Value >>= 8;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MachO::ARM_RELOC_BR24: {
|
||||
case macho::RIT_ARM_Branch24Bit: {
|
||||
// Mask the value into the target address. We know instructions are
|
||||
// 32-bit aligned, so we can do it all at once.
|
||||
uint32_t *p = (uint32_t*)LocalAddress;
|
||||
@ -283,14 +283,14 @@ bool RuntimeDyldMachO::resolveARMRelocation(uint8_t *LocalAddress,
|
||||
*p = (*p & ~0xffffff) | Value;
|
||||
break;
|
||||
}
|
||||
case MachO::ARM_THUMB_RELOC_BR22:
|
||||
case MachO::ARM_THUMB_32BIT_BRANCH:
|
||||
case MachO::ARM_RELOC_HALF:
|
||||
case MachO::ARM_RELOC_HALF_SECTDIFF:
|
||||
case MachO::ARM_RELOC_PAIR:
|
||||
case MachO::ARM_RELOC_SECTDIFF:
|
||||
case MachO::ARM_RELOC_LOCAL_SECTDIFF:
|
||||
case MachO::ARM_RELOC_PB_LA_PTR:
|
||||
case macho::RIT_ARM_ThumbBranch22Bit:
|
||||
case macho::RIT_ARM_ThumbBranch32Bit:
|
||||
case macho::RIT_ARM_Half:
|
||||
case macho::RIT_ARM_HalfDifference:
|
||||
case macho::RIT_Pair:
|
||||
case macho::RIT_Difference:
|
||||
case macho::RIT_ARM_LocalDifference:
|
||||
case macho::RIT_ARM_PreboundLazyPointer:
|
||||
return Error("Relocation type not implemented yet!");
|
||||
}
|
||||
return false;
|
||||
@ -304,7 +304,7 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
|
||||
StubMap &Stubs) {
|
||||
const ObjectFile *OF = Obj.getObjectFile();
|
||||
const MachOObjectFile *MachO = static_cast<const MachOObjectFile*>(OF);
|
||||
MachO::any_relocation_info RE= MachO->getRelocation(RelI.getRawDataRefImpl());
|
||||
macho::RelocationEntry RE = MachO->getRelocation(RelI.getRawDataRefImpl());
|
||||
|
||||
uint32_t RelType = MachO->getAnyRelocationType(RE);
|
||||
|
||||
@ -359,8 +359,8 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
|
||||
Value.Addend = Addend - Addr;
|
||||
}
|
||||
|
||||
if (Arch == Triple::x86_64 && (RelType == MachO::X86_64_RELOC_GOT ||
|
||||
RelType == MachO::X86_64_RELOC_GOT_LOAD)) {
|
||||
if (Arch == Triple::x86_64 && (RelType == macho::RIT_X86_64_GOT ||
|
||||
RelType == macho::RIT_X86_64_GOTLoad)) {
|
||||
assert(IsPCRel);
|
||||
assert(Size == 2);
|
||||
StubMap::const_iterator i = Stubs.find(Value);
|
||||
@ -371,7 +371,7 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
|
||||
Stubs[Value] = Section.StubOffset;
|
||||
uint8_t *GOTEntry = Section.Address + Section.StubOffset;
|
||||
RelocationEntry RE(SectionID, Section.StubOffset,
|
||||
MachO::X86_64_RELOC_UNSIGNED, 0, false, 3);
|
||||
macho::RIT_X86_64_Unsigned, 0, false, 3);
|
||||
if (Value.SymbolName)
|
||||
addRelocationForSymbol(RE, Value.SymbolName);
|
||||
else
|
||||
@ -380,9 +380,9 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
|
||||
Addr = GOTEntry;
|
||||
}
|
||||
resolveRelocation(Section, Offset, (uint64_t)Addr,
|
||||
MachO::X86_64_RELOC_UNSIGNED, Value.Addend, true, 2);
|
||||
macho::RIT_X86_64_Unsigned, Value.Addend, true, 2);
|
||||
} else if (Arch == Triple::arm &&
|
||||
(RelType & 0xf) == MachO::ARM_RELOC_BR24) {
|
||||
(RelType & 0xf) == macho::RIT_ARM_Branch24Bit) {
|
||||
// This is an ARM branch relocation, need to use a stub function.
|
||||
|
||||
// Look up for existing stub.
|
||||
@ -397,7 +397,7 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
|
||||
uint8_t *StubTargetAddr = createStubFunction(Section.Address +
|
||||
Section.StubOffset);
|
||||
RelocationEntry RE(SectionID, StubTargetAddr - Section.Address,
|
||||
MachO::GENERIC_RELOC_VANILLA, Value.Addend);
|
||||
macho::RIT_Vanilla, Value.Addend);
|
||||
if (Value.SymbolName)
|
||||
addRelocationForSymbol(RE, Value.SymbolName);
|
||||
else
|
||||
|
@ -537,10 +537,10 @@ uint64_t MCMachOObjectDisassembler::getEntrypoint() {
|
||||
|
||||
// Look for LC_MAIN.
|
||||
{
|
||||
uint32_t LoadCommandCount = MOOF.getHeader().ncmds;
|
||||
uint32_t LoadCommandCount = MOOF.getHeader().NumLoadCommands;
|
||||
MachOObjectFile::LoadCommandInfo Load = MOOF.getFirstLoadCommandInfo();
|
||||
for (unsigned I = 0;; ++I) {
|
||||
if (Load.C.cmd == MachO::LC_MAIN) {
|
||||
if (Load.C.Type == MachO::LC_MAIN) {
|
||||
EntryFileOffset =
|
||||
((const MachO::entry_point_command *)Load.Ptr)->entryoff;
|
||||
break;
|
||||
|
@ -60,13 +60,13 @@ MCMachObjectSymbolizer(MCContext &Ctx, OwningPtr<MCRelocationInfo> &RelInfo,
|
||||
if (Name == "__stubs") {
|
||||
SectionRef StubsSec = *SI;
|
||||
if (MOOF->is64Bit()) {
|
||||
MachO::section_64 S = MOOF->getSection64(StubsSec.getRawDataRefImpl());
|
||||
StubsIndSymIndex = S.reserved1;
|
||||
StubSize = S.reserved2;
|
||||
macho::Section64 S = MOOF->getSection64(StubsSec.getRawDataRefImpl());
|
||||
StubsIndSymIndex = S.Reserved1;
|
||||
StubSize = S.Reserved2;
|
||||
} else {
|
||||
MachO::section S = MOOF->getSection(StubsSec.getRawDataRefImpl());
|
||||
StubsIndSymIndex = S.reserved1;
|
||||
StubSize = S.reserved2;
|
||||
macho::Section S = MOOF->getSection(StubsSec.getRawDataRefImpl());
|
||||
StubsIndSymIndex = S.Reserved1;
|
||||
StubSize = S.Reserved2;
|
||||
}
|
||||
assert(StubSize && "Mach-O stub entry size can't be zero!");
|
||||
StubsSec.getAddress(StubsStart);
|
||||
@ -86,8 +86,9 @@ StringRef MCMachObjectSymbolizer::findExternalFunctionAt(uint64_t Addr) {
|
||||
if (StubIdx >= StubsCount)
|
||||
return StringRef();
|
||||
|
||||
uint32_t SymtabIdx =
|
||||
macho::IndirectSymbolTableEntry ISTE =
|
||||
MOOF->getIndirectSymbolTableEntry(MOOF->getDysymtabLoadCommand(), StubIdx);
|
||||
uint32_t SymtabIdx = ISTE.Index;
|
||||
|
||||
StringRef SymName;
|
||||
symbol_iterator SI = MOOF->begin_symbols();
|
||||
|
@ -20,11 +20,12 @@
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/MC/MCValue.h"
|
||||
#include "llvm/Object/MachOFormat.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MachO.h"
|
||||
#include <vector>
|
||||
using namespace llvm;
|
||||
using namespace llvm::object;
|
||||
|
||||
void MachObjectWriter::reset() {
|
||||
Relocations.clear();
|
||||
@ -127,7 +128,7 @@ void MachObjectWriter::WriteHeader(unsigned NumLoadCommands,
|
||||
uint32_t Flags = 0;
|
||||
|
||||
if (SubsectionsViaSymbols)
|
||||
Flags |= MachO::MH_SUBSECTIONS_VIA_SYMBOLS;
|
||||
Flags |= macho::HF_SubsectionsViaSymbols;
|
||||
|
||||
// struct mach_header (28 bytes) or
|
||||
// struct mach_header_64 (32 bytes)
|
||||
@ -135,12 +136,12 @@ void MachObjectWriter::WriteHeader(unsigned NumLoadCommands,
|
||||
uint64_t Start = OS.tell();
|
||||
(void) Start;
|
||||
|
||||
Write32(is64Bit() ? MachO::MH_MAGIC_64 : MachO::MH_MAGIC);
|
||||
Write32(is64Bit() ? macho::HM_Object64 : macho::HM_Object32);
|
||||
|
||||
Write32(TargetObjectWriter->getCPUType());
|
||||
Write32(TargetObjectWriter->getCPUSubtype());
|
||||
|
||||
Write32(MachO::MH_OBJECT);
|
||||
Write32(macho::HFT_Object);
|
||||
Write32(NumLoadCommands);
|
||||
Write32(LoadCommandsSize);
|
||||
Write32(Flags);
|
||||
@ -148,7 +149,7 @@ void MachObjectWriter::WriteHeader(unsigned NumLoadCommands,
|
||||
Write32(0); // reserved
|
||||
|
||||
assert(OS.tell() - Start ==
|
||||
(is64Bit()?sizeof(MachO::mach_header_64): sizeof(MachO::mach_header)));
|
||||
(is64Bit() ? macho::Header64Size : macho::Header32Size));
|
||||
}
|
||||
|
||||
/// WriteSegmentLoadCommand - Write a segment load command.
|
||||
@ -166,12 +167,12 @@ void MachObjectWriter::WriteSegmentLoadCommand(unsigned NumSections,
|
||||
(void) Start;
|
||||
|
||||
unsigned SegmentLoadCommandSize =
|
||||
is64Bit() ? sizeof(MachO::segment_command_64):
|
||||
sizeof(MachO::segment_command);
|
||||
Write32(is64Bit() ? MachO::LC_SEGMENT_64 : MachO::LC_SEGMENT);
|
||||
is64Bit() ? macho::SegmentLoadCommand64Size:
|
||||
macho::SegmentLoadCommand32Size;
|
||||
Write32(is64Bit() ? macho::LCT_Segment64 : macho::LCT_Segment);
|
||||
Write32(SegmentLoadCommandSize +
|
||||
NumSections * (is64Bit() ? sizeof(MachO::section_64) :
|
||||
sizeof(MachO::section)));
|
||||
NumSections * (is64Bit() ? macho::Section64Size :
|
||||
macho::Section32Size));
|
||||
|
||||
WriteBytes("", 16);
|
||||
if (is64Bit()) {
|
||||
@ -239,8 +240,8 @@ void MachObjectWriter::WriteSection(const MCAssembler &Asm,
|
||||
if (is64Bit())
|
||||
Write32(0); // reserved3
|
||||
|
||||
assert(OS.tell() - Start == (is64Bit() ? sizeof(MachO::section_64) :
|
||||
sizeof(MachO::section)));
|
||||
assert(OS.tell() - Start == (is64Bit() ? macho::Section64Size :
|
||||
macho::Section32Size));
|
||||
}
|
||||
|
||||
void MachObjectWriter::WriteSymtabLoadCommand(uint32_t SymbolOffset,
|
||||
@ -252,14 +253,14 @@ void MachObjectWriter::WriteSymtabLoadCommand(uint32_t SymbolOffset,
|
||||
uint64_t Start = OS.tell();
|
||||
(void) Start;
|
||||
|
||||
Write32(MachO::LC_SYMTAB);
|
||||
Write32(sizeof(MachO::symtab_command));
|
||||
Write32(macho::LCT_Symtab);
|
||||
Write32(macho::SymtabLoadCommandSize);
|
||||
Write32(SymbolOffset);
|
||||
Write32(NumSymbols);
|
||||
Write32(StringTableOffset);
|
||||
Write32(StringTableSize);
|
||||
|
||||
assert(OS.tell() - Start == sizeof(MachO::symtab_command));
|
||||
assert(OS.tell() - Start == macho::SymtabLoadCommandSize);
|
||||
}
|
||||
|
||||
void MachObjectWriter::WriteDysymtabLoadCommand(uint32_t FirstLocalSymbol,
|
||||
@ -275,8 +276,8 @@ void MachObjectWriter::WriteDysymtabLoadCommand(uint32_t FirstLocalSymbol,
|
||||
uint64_t Start = OS.tell();
|
||||
(void) Start;
|
||||
|
||||
Write32(MachO::LC_DYSYMTAB);
|
||||
Write32(sizeof(MachO::dysymtab_command));
|
||||
Write32(macho::LCT_Dysymtab);
|
||||
Write32(macho::DysymtabLoadCommandSize);
|
||||
Write32(FirstLocalSymbol);
|
||||
Write32(NumLocalSymbols);
|
||||
Write32(FirstExternalSymbol);
|
||||
@ -296,7 +297,7 @@ void MachObjectWriter::WriteDysymtabLoadCommand(uint32_t FirstLocalSymbol,
|
||||
Write32(0); // locreloff
|
||||
Write32(0); // nlocrel
|
||||
|
||||
assert(OS.tell() - Start == sizeof(MachO::dysymtab_command));
|
||||
assert(OS.tell() - Start == macho::DysymtabLoadCommandSize);
|
||||
}
|
||||
|
||||
void MachObjectWriter::WriteNlist(MachSymbolData &MSD,
|
||||
@ -311,20 +312,20 @@ void MachObjectWriter::WriteNlist(MachSymbolData &MSD,
|
||||
//
|
||||
// FIXME: Are the prebound or indirect fields possible here?
|
||||
if (Symbol.isUndefined())
|
||||
Type = MachO::N_UNDF;
|
||||
Type = macho::STT_Undefined;
|
||||
else if (Symbol.isAbsolute())
|
||||
Type = MachO::N_ABS;
|
||||
Type = macho::STT_Absolute;
|
||||
else
|
||||
Type = MachO::N_SECT;
|
||||
Type = macho::STT_Section;
|
||||
|
||||
// FIXME: Set STAB bits.
|
||||
|
||||
if (Data.isPrivateExtern())
|
||||
Type |= MachO::N_PEXT;
|
||||
Type |= macho::STF_PrivateExtern;
|
||||
|
||||
// Set external bit.
|
||||
if (Data.isExternal() || Symbol.isUndefined())
|
||||
Type |= MachO::N_EXT;
|
||||
Type |= macho::STF_External;
|
||||
|
||||
// Compute the symbol address.
|
||||
if (Symbol.isDefined()) {
|
||||
@ -368,17 +369,17 @@ void MachObjectWriter::WriteLinkeditLoadCommand(uint32_t Type,
|
||||
(void) Start;
|
||||
|
||||
Write32(Type);
|
||||
Write32(sizeof(MachO::linkedit_data_command));
|
||||
Write32(macho::LinkeditLoadCommandSize);
|
||||
Write32(DataOffset);
|
||||
Write32(DataSize);
|
||||
|
||||
assert(OS.tell() - Start == sizeof(MachO::linkedit_data_command));
|
||||
assert(OS.tell() - Start == macho::LinkeditLoadCommandSize);
|
||||
}
|
||||
|
||||
static unsigned ComputeLinkerOptionsLoadCommandSize(
|
||||
const std::vector<std::string> &Options, bool is64Bit)
|
||||
{
|
||||
unsigned Size = sizeof(MachO::linker_options_command);
|
||||
unsigned Size = sizeof(macho::LinkerOptionsLoadCommand);
|
||||
for (unsigned i = 0, e = Options.size(); i != e; ++i)
|
||||
Size += Options[i].size() + 1;
|
||||
return RoundUpToAlignment(Size, is64Bit ? 8 : 4);
|
||||
@ -391,10 +392,10 @@ void MachObjectWriter::WriteLinkerOptionsLoadCommand(
|
||||
uint64_t Start = OS.tell();
|
||||
(void) Start;
|
||||
|
||||
Write32(MachO::LC_LINKER_OPTIONS);
|
||||
Write32(macho::LCT_LinkerOptions);
|
||||
Write32(Size);
|
||||
Write32(Options.size());
|
||||
uint64_t BytesWritten = sizeof(MachO::linker_options_command);
|
||||
uint64_t BytesWritten = sizeof(macho::LinkerOptionsLoadCommand);
|
||||
for (unsigned i = 0, e = Options.size(); i != e; ++i) {
|
||||
// Write each string, including the null byte.
|
||||
const std::string &Option = Options[i];
|
||||
@ -722,14 +723,14 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
// section headers) and the symbol table.
|
||||
unsigned NumLoadCommands = 1;
|
||||
uint64_t LoadCommandsSize = is64Bit() ?
|
||||
sizeof(MachO::segment_command_64) + NumSections * sizeof(MachO::section_64):
|
||||
sizeof(MachO::segment_command) + NumSections * sizeof(MachO::section);
|
||||
macho::SegmentLoadCommand64Size + NumSections * macho::Section64Size :
|
||||
macho::SegmentLoadCommand32Size + NumSections * macho::Section32Size;
|
||||
|
||||
// Add the data-in-code load command size, if used.
|
||||
unsigned NumDataRegions = Asm.getDataRegions().size();
|
||||
if (NumDataRegions) {
|
||||
++NumLoadCommands;
|
||||
LoadCommandsSize += sizeof(MachO::linkedit_data_command);
|
||||
LoadCommandsSize += macho::LinkeditLoadCommandSize;
|
||||
}
|
||||
|
||||
// Add the symbol table load command sizes, if used.
|
||||
@ -737,8 +738,8 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
UndefinedSymbolData.size();
|
||||
if (NumSymbols) {
|
||||
NumLoadCommands += 2;
|
||||
LoadCommandsSize += (sizeof(MachO::symtab_command) +
|
||||
sizeof(MachO::dysymtab_command));
|
||||
LoadCommandsSize += (macho::SymtabLoadCommandSize +
|
||||
macho::DysymtabLoadCommandSize);
|
||||
}
|
||||
|
||||
// Add the linker option load commands sizes.
|
||||
@ -752,8 +753,8 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
|
||||
// Compute the total size of the section data, as well as its file size and vm
|
||||
// size.
|
||||
uint64_t SectionDataStart = (is64Bit() ? sizeof(MachO::mach_header_64) :
|
||||
sizeof(MachO::mach_header)) + LoadCommandsSize;
|
||||
uint64_t SectionDataStart = (is64Bit() ? macho::Header64Size :
|
||||
macho::Header32Size) + LoadCommandsSize;
|
||||
uint64_t SectionDataSize = 0;
|
||||
uint64_t SectionDataFileSize = 0;
|
||||
uint64_t VMSize = 0;
|
||||
@ -790,11 +791,11 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
uint64_t RelocTableEnd = SectionDataStart + SectionDataFileSize;
|
||||
for (MCAssembler::const_iterator it = Asm.begin(),
|
||||
ie = Asm.end(); it != ie; ++it) {
|
||||
std::vector<MachO::any_relocation_info> &Relocs = Relocations[it];
|
||||
std::vector<macho::RelocationEntry> &Relocs = Relocations[it];
|
||||
unsigned NumRelocs = Relocs.size();
|
||||
uint64_t SectionStart = SectionDataStart + getSectionAddress(it);
|
||||
WriteSection(Asm, Layout, *it, SectionStart, RelocTableEnd, NumRelocs);
|
||||
RelocTableEnd += NumRelocs * sizeof(MachO::any_relocation_info);
|
||||
RelocTableEnd += NumRelocs * macho::RelocationInfoSize;
|
||||
}
|
||||
|
||||
// Write the data-in-code load command, if used.
|
||||
@ -802,7 +803,7 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
if (NumDataRegions) {
|
||||
uint64_t DataRegionsOffset = RelocTableEnd;
|
||||
uint64_t DataRegionsSize = NumDataRegions * 8;
|
||||
WriteLinkeditLoadCommand(MachO::LC_DATA_IN_CODE, DataRegionsOffset,
|
||||
WriteLinkeditLoadCommand(macho::LCT_DataInCode, DataRegionsOffset,
|
||||
DataRegionsSize);
|
||||
}
|
||||
|
||||
@ -829,9 +830,8 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
|
||||
// The string table is written after symbol table.
|
||||
uint64_t StringTableOffset =
|
||||
SymbolTableOffset + NumSymTabSymbols * (is64Bit() ?
|
||||
sizeof(MachO::nlist_64) :
|
||||
sizeof(MachO::nlist));
|
||||
SymbolTableOffset + NumSymTabSymbols * (is64Bit() ? macho::Nlist64Size :
|
||||
macho::Nlist32Size);
|
||||
WriteSymtabLoadCommand(SymbolTableOffset, NumSymTabSymbols,
|
||||
StringTableOffset, StringTable.size());
|
||||
|
||||
@ -864,10 +864,10 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
ie = Asm.end(); it != ie; ++it) {
|
||||
// Write the section relocation entries, in reverse order to match 'as'
|
||||
// (approximately, the exact algorithm is more complicated than this).
|
||||
std::vector<MachO::any_relocation_info> &Relocs = Relocations[it];
|
||||
std::vector<macho::RelocationEntry> &Relocs = Relocations[it];
|
||||
for (unsigned i = 0, e = Relocs.size(); i != e; ++i) {
|
||||
Write32(Relocs[e - i - 1].r_word0);
|
||||
Write32(Relocs[e - i - 1].r_word1);
|
||||
Write32(Relocs[e - i - 1].Word0);
|
||||
Write32(Relocs[e - i - 1].Word1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -906,9 +906,9 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
// If this symbol is defined and internal, mark it as such.
|
||||
if (it->Symbol->isDefined() &&
|
||||
!Asm.getSymbolData(*it->Symbol).isExternal()) {
|
||||
uint32_t Flags = MachO::INDIRECT_SYMBOL_LOCAL;
|
||||
uint32_t Flags = macho::ISF_Local;
|
||||
if (it->Symbol->isAbsolute())
|
||||
Flags |= MachO::INDIRECT_SYMBOL_ABS;
|
||||
Flags |= macho::ISF_Absolute;
|
||||
Write32(Flags);
|
||||
continue;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -31,18 +31,18 @@ template<typename T>
|
||||
static void SwapStruct(T &Value);
|
||||
|
||||
template<>
|
||||
void SwapStruct(MachO::fat_header &H) {
|
||||
SwapValue(H.magic);
|
||||
SwapValue(H.nfat_arch);
|
||||
void SwapStruct(macho::FatHeader &H) {
|
||||
SwapValue(H.Magic);
|
||||
SwapValue(H.NumFatArch);
|
||||
}
|
||||
|
||||
template<>
|
||||
void SwapStruct(MachO::fat_arch &H) {
|
||||
SwapValue(H.cputype);
|
||||
SwapValue(H.cpusubtype);
|
||||
SwapValue(H.offset);
|
||||
SwapValue(H.size);
|
||||
SwapValue(H.align);
|
||||
void SwapStruct(macho::FatArchHeader &H) {
|
||||
SwapValue(H.CPUType);
|
||||
SwapValue(H.CPUSubtype);
|
||||
SwapValue(H.Offset);
|
||||
SwapValue(H.Size);
|
||||
SwapValue(H.Align);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
@ -63,10 +63,10 @@ MachOUniversalBinary::ObjectForArch::ObjectForArch(
|
||||
} else {
|
||||
// Parse object header.
|
||||
StringRef ParentData = Parent->getData();
|
||||
const char *HeaderPos = ParentData.begin() + sizeof(MachO::fat_header) +
|
||||
Index * sizeof(MachO::fat_arch);
|
||||
Header = getUniversalBinaryStruct<MachO::fat_arch>(HeaderPos);
|
||||
if (ParentData.size() < Header.offset + Header.size) {
|
||||
const char *HeaderPos = ParentData.begin() + macho::FatHeaderSize +
|
||||
Index * macho::FatArchHeaderSize;
|
||||
Header = getUniversalBinaryStruct<macho::FatArchHeader>(HeaderPos);
|
||||
if (ParentData.size() < Header.Offset + Header.Size) {
|
||||
clear();
|
||||
}
|
||||
}
|
||||
@ -76,10 +76,10 @@ error_code MachOUniversalBinary::ObjectForArch::getAsObjectFile(
|
||||
OwningPtr<ObjectFile> &Result) const {
|
||||
if (Parent) {
|
||||
StringRef ParentData = Parent->getData();
|
||||
StringRef ObjectData = ParentData.substr(Header.offset, Header.size);
|
||||
StringRef ObjectData = ParentData.substr(Header.Offset, Header.Size);
|
||||
std::string ObjectName =
|
||||
Parent->getFileName().str() + ":" +
|
||||
Triple::getArchTypeName(MachOObjectFile::getArch(Header.cputype));
|
||||
Triple::getArchTypeName(MachOObjectFile::getArch(Header.CPUType));
|
||||
MemoryBuffer *ObjBuffer = MemoryBuffer::getMemBuffer(
|
||||
ObjectData, ObjectName, false);
|
||||
if (ObjectFile *Obj = ObjectFile::createMachOObjectFile(ObjBuffer)) {
|
||||
@ -96,31 +96,31 @@ MachOUniversalBinary::MachOUniversalBinary(MemoryBuffer *Source,
|
||||
error_code &ec)
|
||||
: Binary(Binary::ID_MachOUniversalBinary, Source),
|
||||
NumberOfObjects(0) {
|
||||
if (Source->getBufferSize() < sizeof(MachO::fat_header)) {
|
||||
if (Source->getBufferSize() < macho::FatHeaderSize) {
|
||||
ec = object_error::invalid_file_type;
|
||||
return;
|
||||
}
|
||||
// Check for magic value and sufficient header size.
|
||||
StringRef Buf = getData();
|
||||
MachO::fat_header H= getUniversalBinaryStruct<MachO::fat_header>(Buf.begin());
|
||||
NumberOfObjects = H.nfat_arch;
|
||||
uint32_t MinSize = sizeof(MachO::fat_header) +
|
||||
sizeof(MachO::fat_arch) * NumberOfObjects;
|
||||
if (H.magic != MachO::FAT_MAGIC || Buf.size() < MinSize) {
|
||||
macho::FatHeader H = getUniversalBinaryStruct<macho::FatHeader>(Buf.begin());
|
||||
NumberOfObjects = H.NumFatArch;
|
||||
uint32_t MinSize = macho::FatHeaderSize +
|
||||
macho::FatArchHeaderSize * NumberOfObjects;
|
||||
if (H.Magic != macho::HM_Universal || Buf.size() < MinSize) {
|
||||
ec = object_error::parse_failed;
|
||||
return;
|
||||
}
|
||||
ec = object_error::success;
|
||||
}
|
||||
|
||||
static bool getCTMForArch(Triple::ArchType Arch, MachO::CPUType &CTM) {
|
||||
static bool getCTMForArch(Triple::ArchType Arch, mach::CPUTypeMachine &CTM) {
|
||||
switch (Arch) {
|
||||
case Triple::x86: CTM = MachO::CPU_TYPE_I386; return true;
|
||||
case Triple::x86_64: CTM = MachO::CPU_TYPE_X86_64; return true;
|
||||
case Triple::arm: CTM = MachO::CPU_TYPE_ARM; return true;
|
||||
case Triple::sparc: CTM = MachO::CPU_TYPE_SPARC; return true;
|
||||
case Triple::ppc: CTM = MachO::CPU_TYPE_POWERPC; return true;
|
||||
case Triple::ppc64: CTM = MachO::CPU_TYPE_POWERPC64; return true;
|
||||
case Triple::x86: CTM = mach::CTM_i386; return true;
|
||||
case Triple::x86_64: CTM = mach::CTM_x86_64; return true;
|
||||
case Triple::arm: CTM = mach::CTM_ARM; return true;
|
||||
case Triple::sparc: CTM = mach::CTM_SPARC; return true;
|
||||
case Triple::ppc: CTM = mach::CTM_PowerPC; return true;
|
||||
case Triple::ppc64: CTM = mach::CTM_PowerPC64; return true;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
@ -128,7 +128,7 @@ static bool getCTMForArch(Triple::ArchType Arch, MachO::CPUType &CTM) {
|
||||
error_code
|
||||
MachOUniversalBinary::getObjectForArch(Triple::ArchType Arch,
|
||||
OwningPtr<ObjectFile> &Result) const {
|
||||
MachO::CPUType CTM;
|
||||
mach::CPUTypeMachine CTM;
|
||||
if (!getCTMForArch(Arch, CTM))
|
||||
return object_error::arch_not_found;
|
||||
for (object_iterator I = begin_objects(), E = end_objects(); I != E; ++I) {
|
||||
|
@ -25,9 +25,9 @@
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/MC/MCSubtargetInfo.h"
|
||||
#include "llvm/MC/MCValue.h"
|
||||
#include "llvm/Object/MachOFormat.h"
|
||||
#include "llvm/Support/ELF.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MachO.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
using namespace llvm;
|
||||
|
||||
@ -640,16 +640,16 @@ public:
|
||||
// FIXME: This should be in a separate file.
|
||||
class DarwinARMAsmBackend : public ARMAsmBackend {
|
||||
public:
|
||||
const MachO::CPUSubTypeARM Subtype;
|
||||
const object::mach::CPUSubtypeARM Subtype;
|
||||
DarwinARMAsmBackend(const Target &T, const StringRef TT,
|
||||
MachO::CPUSubTypeARM st)
|
||||
object::mach::CPUSubtypeARM st)
|
||||
: ARMAsmBackend(T, TT), Subtype(st) {
|
||||
HasDataInCodeSupport = true;
|
||||
}
|
||||
|
||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||
return createARMMachObjectWriter(OS, /*Is64Bit=*/false,
|
||||
MachO::CPU_TYPE_ARM,
|
||||
object::mach::CTM_ARM,
|
||||
Subtype);
|
||||
}
|
||||
|
||||
@ -664,18 +664,18 @@ MCAsmBackend *llvm::createARMAsmBackend(const Target &T, StringRef TT, StringRef
|
||||
Triple TheTriple(TT);
|
||||
|
||||
if (TheTriple.isOSDarwin()) {
|
||||
MachO::CPUSubTypeARM CS =
|
||||
StringSwitch<MachO::CPUSubTypeARM>(TheTriple.getArchName())
|
||||
.Cases("armv4t", "thumbv4t", MachO::CPU_SUBTYPE_ARM_V4T)
|
||||
.Cases("armv5e", "thumbv5e", MachO::CPU_SUBTYPE_ARM_V5TEJ)
|
||||
.Cases("armv6", "thumbv6", MachO::CPU_SUBTYPE_ARM_V6)
|
||||
.Cases("armv6m", "thumbv6m", MachO::CPU_SUBTYPE_ARM_V6M)
|
||||
.Cases("armv7em", "thumbv7em", MachO::CPU_SUBTYPE_ARM_V7EM)
|
||||
.Cases("armv7f", "thumbv7f", MachO::CPU_SUBTYPE_ARM_V7F)
|
||||
.Cases("armv7k", "thumbv7k", MachO::CPU_SUBTYPE_ARM_V7K)
|
||||
.Cases("armv7m", "thumbv7m", MachO::CPU_SUBTYPE_ARM_V7M)
|
||||
.Cases("armv7s", "thumbv7s", MachO::CPU_SUBTYPE_ARM_V7S)
|
||||
.Default(MachO::CPU_SUBTYPE_ARM_V7);
|
||||
object::mach::CPUSubtypeARM CS =
|
||||
StringSwitch<object::mach::CPUSubtypeARM>(TheTriple.getArchName())
|
||||
.Cases("armv4t", "thumbv4t", object::mach::CSARM_V4T)
|
||||
.Cases("armv5e", "thumbv5e",object::mach::CSARM_V5TEJ)
|
||||
.Cases("armv6", "thumbv6", object::mach::CSARM_V6)
|
||||
.Cases("armv6m", "thumbv6m", object::mach::CSARM_V6M)
|
||||
.Cases("armv7em", "thumbv7em", object::mach::CSARM_V7EM)
|
||||
.Cases("armv7f", "thumbv7f", object::mach::CSARM_V7F)
|
||||
.Cases("armv7k", "thumbv7k", object::mach::CSARM_V7K)
|
||||
.Cases("armv7m", "thumbv7m", object::mach::CSARM_V7M)
|
||||
.Cases("armv7s", "thumbv7s", object::mach::CSARM_V7S)
|
||||
.Default(object::mach::CSARM_V7);
|
||||
|
||||
return new DarwinARMAsmBackend(T, TT, CS);
|
||||
}
|
||||
|
@ -20,9 +20,10 @@
|
||||
#include "llvm/MC/MCMachOSymbolFlags.h"
|
||||
#include "llvm/MC/MCMachObjectWriter.h"
|
||||
#include "llvm/MC/MCValue.h"
|
||||
#include "llvm/Object/MachOFormat.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MachO.h"
|
||||
using namespace llvm;
|
||||
using namespace llvm::object;
|
||||
|
||||
namespace {
|
||||
class ARMMachObjectWriter : public MCMachObjectTargetWriter {
|
||||
@ -62,7 +63,7 @@ public:
|
||||
|
||||
static bool getARMFixupKindMachOInfo(unsigned Kind, unsigned &RelocType,
|
||||
unsigned &Log2Size) {
|
||||
RelocType = unsigned(MachO::ARM_RELOC_VANILLA);
|
||||
RelocType = unsigned(macho::RIT_Vanilla);
|
||||
Log2Size = ~0U;
|
||||
|
||||
switch (Kind) {
|
||||
@ -91,21 +92,21 @@ static bool getARMFixupKindMachOInfo(unsigned Kind, unsigned &RelocType,
|
||||
case ARM::fixup_arm_uncondbl:
|
||||
case ARM::fixup_arm_condbl:
|
||||
case ARM::fixup_arm_blx:
|
||||
RelocType = unsigned(MachO::ARM_RELOC_BR24);
|
||||
RelocType = unsigned(macho::RIT_ARM_Branch24Bit);
|
||||
// Report as 'long', even though that is not quite accurate.
|
||||
Log2Size = llvm::Log2_32(4);
|
||||
return true;
|
||||
|
||||
// Handle Thumb branches.
|
||||
case ARM::fixup_arm_thumb_br:
|
||||
RelocType = unsigned(MachO::ARM_THUMB_RELOC_BR22);
|
||||
RelocType = unsigned(macho::RIT_ARM_ThumbBranch22Bit);
|
||||
Log2Size = llvm::Log2_32(2);
|
||||
return true;
|
||||
|
||||
case ARM::fixup_t2_uncondbranch:
|
||||
case ARM::fixup_arm_thumb_bl:
|
||||
case ARM::fixup_arm_thumb_blx:
|
||||
RelocType = unsigned(MachO::ARM_THUMB_RELOC_BR22);
|
||||
RelocType = unsigned(macho::RIT_ARM_ThumbBranch22Bit);
|
||||
Log2Size = llvm::Log2_32(4);
|
||||
return true;
|
||||
|
||||
@ -120,23 +121,23 @@ static bool getARMFixupKindMachOInfo(unsigned Kind, unsigned &RelocType,
|
||||
// 1 - thumb instructions
|
||||
case ARM::fixup_arm_movt_hi16:
|
||||
case ARM::fixup_arm_movt_hi16_pcrel:
|
||||
RelocType = unsigned(MachO::ARM_RELOC_HALF);
|
||||
RelocType = unsigned(macho::RIT_ARM_Half);
|
||||
Log2Size = 1;
|
||||
return true;
|
||||
case ARM::fixup_t2_movt_hi16:
|
||||
case ARM::fixup_t2_movt_hi16_pcrel:
|
||||
RelocType = unsigned(MachO::ARM_RELOC_HALF);
|
||||
RelocType = unsigned(macho::RIT_ARM_Half);
|
||||
Log2Size = 3;
|
||||
return true;
|
||||
|
||||
case ARM::fixup_arm_movw_lo16:
|
||||
case ARM::fixup_arm_movw_lo16_pcrel:
|
||||
RelocType = unsigned(MachO::ARM_RELOC_HALF);
|
||||
RelocType = unsigned(macho::RIT_ARM_Half);
|
||||
Log2Size = 0;
|
||||
return true;
|
||||
case ARM::fixup_t2_movw_lo16:
|
||||
case ARM::fixup_t2_movw_lo16_pcrel:
|
||||
RelocType = unsigned(MachO::ARM_RELOC_HALF);
|
||||
RelocType = unsigned(macho::RIT_ARM_Half);
|
||||
Log2Size = 2;
|
||||
return true;
|
||||
}
|
||||
@ -152,7 +153,7 @@ RecordARMScatteredHalfRelocation(MachObjectWriter *Writer,
|
||||
uint64_t &FixedValue) {
|
||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
||||
unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
|
||||
unsigned Type = MachO::ARM_RELOC_HALF;
|
||||
unsigned Type = macho::RIT_ARM_Half;
|
||||
|
||||
// See <reloc.h>.
|
||||
const MCSymbol *A = &Target.getSymA()->getSymbol();
|
||||
@ -178,7 +179,7 @@ RecordARMScatteredHalfRelocation(MachObjectWriter *Writer,
|
||||
"' can not be undefined in a subtraction expression");
|
||||
|
||||
// Select the appropriate difference relocation type.
|
||||
Type = MachO::ARM_RELOC_HALF_SECTDIFF;
|
||||
Type = macho::RIT_ARM_HalfDifference;
|
||||
Value2 = Writer->getSymbolAddress(B_SD, Layout);
|
||||
FixedValue -= Writer->getSectionAddress(B_SD->getFragment()->getParent());
|
||||
}
|
||||
@ -222,28 +223,29 @@ RecordARMScatteredHalfRelocation(MachObjectWriter *Writer,
|
||||
break;
|
||||
}
|
||||
|
||||
MachO::scattered_relocation_info MRE;
|
||||
if (Type == MachO::ARM_RELOC_HALF_SECTDIFF) {
|
||||
if (Type == macho::RIT_ARM_HalfDifference) {
|
||||
uint32_t OtherHalf = MovtBit
|
||||
? (FixedValue & 0xffff) : ((FixedValue & 0xffff0000) >> 16);
|
||||
|
||||
MRE.r_address = OtherHalf;
|
||||
MRE.r_type = MachO::ARM_RELOC_PAIR;
|
||||
MRE.r_length = ((MovtBit << 0) |
|
||||
(ThumbBit << 1));
|
||||
MRE.r_pcrel = IsPCRel;
|
||||
MRE.r_scattered = 1;
|
||||
MRE.r_value = Value2;
|
||||
macho::RelocationEntry MRE;
|
||||
MRE.Word0 = ((OtherHalf << 0) |
|
||||
(macho::RIT_Pair << 24) |
|
||||
(MovtBit << 28) |
|
||||
(ThumbBit << 29) |
|
||||
(IsPCRel << 30) |
|
||||
macho::RF_Scattered);
|
||||
MRE.Word1 = Value2;
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
}
|
||||
|
||||
MRE.r_address = FixupOffset;
|
||||
MRE.r_type = Type;
|
||||
MRE.r_length = ((MovtBit << 0) |
|
||||
(ThumbBit << 1));
|
||||
MRE.r_pcrel = IsPCRel;
|
||||
MRE.r_scattered = 1;
|
||||
MRE.r_value = Value;
|
||||
macho::RelocationEntry MRE;
|
||||
MRE.Word0 = ((FixupOffset << 0) |
|
||||
(Type << 24) |
|
||||
(MovtBit << 28) |
|
||||
(ThumbBit << 29) |
|
||||
(IsPCRel << 30) |
|
||||
macho::RF_Scattered);
|
||||
MRE.Word1 = Value;
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
}
|
||||
|
||||
@ -257,7 +259,7 @@ void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter *Writer,
|
||||
uint64_t &FixedValue) {
|
||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
||||
unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
|
||||
unsigned Type = MachO::ARM_RELOC_VANILLA;
|
||||
unsigned Type = macho::RIT_Vanilla;
|
||||
|
||||
// See <reloc.h>.
|
||||
const MCSymbol *A = &Target.getSymA()->getSymbol();
|
||||
@ -282,30 +284,31 @@ void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter *Writer,
|
||||
"' can not be undefined in a subtraction expression");
|
||||
|
||||
// Select the appropriate difference relocation type.
|
||||
Type = MachO::ARM_RELOC_SECTDIFF;
|
||||
Type = macho::RIT_Difference;
|
||||
Value2 = Writer->getSymbolAddress(B_SD, Layout);
|
||||
FixedValue -= Writer->getSectionAddress(B_SD->getFragment()->getParent());
|
||||
}
|
||||
|
||||
MachO::scattered_relocation_info MRE;
|
||||
// Relocations are written out in reverse order, so the PAIR comes first.
|
||||
if (Type == MachO::ARM_RELOC_SECTDIFF ||
|
||||
Type == MachO::ARM_RELOC_LOCAL_SECTDIFF) {
|
||||
MRE.r_address = 0;
|
||||
MRE.r_type = MachO::ARM_RELOC_PAIR;
|
||||
MRE.r_length = Log2Size;
|
||||
MRE.r_pcrel = IsPCRel;
|
||||
MRE.r_scattered = 1;
|
||||
MRE.r_value = Value2;
|
||||
if (Type == macho::RIT_Difference ||
|
||||
Type == macho::RIT_Generic_LocalDifference) {
|
||||
macho::RelocationEntry MRE;
|
||||
MRE.Word0 = ((0 << 0) |
|
||||
(macho::RIT_Pair << 24) |
|
||||
(Log2Size << 28) |
|
||||
(IsPCRel << 30) |
|
||||
macho::RF_Scattered);
|
||||
MRE.Word1 = Value2;
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
}
|
||||
|
||||
MRE.r_address = FixupOffset;
|
||||
MRE.r_type = Type;
|
||||
MRE.r_length = Log2Size;
|
||||
MRE.r_pcrel = IsPCRel;
|
||||
MRE.r_scattered = 1;
|
||||
MRE.r_value = Value;
|
||||
macho::RelocationEntry MRE;
|
||||
MRE.Word0 = ((FixupOffset << 0) |
|
||||
(Type << 24) |
|
||||
(Log2Size << 28) |
|
||||
(IsPCRel << 30) |
|
||||
macho::RF_Scattered);
|
||||
MRE.Word1 = Value;
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
}
|
||||
|
||||
@ -323,13 +326,13 @@ bool ARMMachObjectWriter::requiresExternRelocation(MachObjectWriter *Writer,
|
||||
switch (RelocType) {
|
||||
default:
|
||||
return false;
|
||||
case MachO::ARM_RELOC_BR24:
|
||||
case macho::RIT_ARM_Branch24Bit:
|
||||
// PC pre-adjustment of 8 for these instructions.
|
||||
Value -= 8;
|
||||
// ARM BL/BLX has a 25-bit offset.
|
||||
Range = 0x1ffffff;
|
||||
break;
|
||||
case MachO::ARM_THUMB_RELOC_BR22:
|
||||
case macho::RIT_ARM_ThumbBranch22Bit:
|
||||
// PC pre-adjustment of 4 for these instructions.
|
||||
Value -= 4;
|
||||
// Thumb BL/BLX has a 24-bit offset.
|
||||
@ -358,7 +361,7 @@ void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
|
||||
uint64_t &FixedValue) {
|
||||
unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
|
||||
unsigned Log2Size;
|
||||
unsigned RelocType = MachO::ARM_RELOC_VANILLA;
|
||||
unsigned RelocType = macho::RIT_Vanilla;
|
||||
if (!getARMFixupKindMachOInfo(Fixup.getKind(), RelocType, Log2Size))
|
||||
// If we failed to get fixup kind info, it's because there's no legal
|
||||
// relocation type for the fixup kind. This happens when it's a fixup that's
|
||||
@ -371,7 +374,7 @@ void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
|
||||
// scattered relocation entry. Differences always require scattered
|
||||
// relocations.
|
||||
if (Target.getSymB()) {
|
||||
if (RelocType == MachO::ARM_RELOC_HALF)
|
||||
if (RelocType == macho::RIT_ARM_Half)
|
||||
return RecordARMScatteredHalfRelocation(Writer, Asm, Layout, Fragment,
|
||||
Fixup, Target, FixedValue);
|
||||
return RecordARMScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
|
||||
@ -389,7 +392,7 @@ void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
|
||||
//
|
||||
// Is this right for ARM?
|
||||
uint32_t Offset = Target.getConstant();
|
||||
if (IsPCRel && RelocType == MachO::ARM_RELOC_VANILLA)
|
||||
if (IsPCRel && RelocType == macho::RIT_Vanilla)
|
||||
Offset += 1 << Log2Size;
|
||||
if (Offset && SD && !Writer->doesSymbolRequireExternRelocation(SD))
|
||||
return RecordARMScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
|
||||
@ -442,17 +445,17 @@ void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
|
||||
}
|
||||
|
||||
// struct relocation_info (8 bytes)
|
||||
MachO::relocation_info MRE;
|
||||
MRE.r_address = FixupOffset;
|
||||
MRE.r_symbolnum = Index;
|
||||
MRE.r_pcrel = IsPCRel;
|
||||
MRE.r_length = Log2Size;
|
||||
MRE.r_extern = IsExtern;
|
||||
MRE.r_type = Type;
|
||||
macho::RelocationEntry MRE;
|
||||
MRE.Word0 = FixupOffset;
|
||||
MRE.Word1 = ((Index << 0) |
|
||||
(IsPCRel << 24) |
|
||||
(Log2Size << 25) |
|
||||
(IsExtern << 27) |
|
||||
(Type << 28));
|
||||
|
||||
// Even when it's not a scattered relocation, movw/movt always uses
|
||||
// a PAIR relocation.
|
||||
if (Type == MachO::ARM_RELOC_HALF) {
|
||||
if (Type == macho::RIT_ARM_Half) {
|
||||
// The other-half value only gets populated for the movt and movw
|
||||
// relocation entries.
|
||||
uint32_t Value = 0;
|
||||
@ -471,12 +474,11 @@ void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
|
||||
Value = FixedValue & 0xffff;
|
||||
break;
|
||||
}
|
||||
MachO::relocation_info MREPair;
|
||||
MREPair.r_address = Value;
|
||||
MREPair.r_symbolnum = 0xffffff;
|
||||
MREPair.r_length = Log2Size;
|
||||
MREPair.r_pcrel = MREPair.r_extern = 0;
|
||||
MREPair.r_type = MachO::ARM_RELOC_PAIR;
|
||||
macho::RelocationEntry MREPair;
|
||||
MREPair.Word0 = Value;
|
||||
MREPair.Word1 = ((0xffffff) |
|
||||
(Log2Size << 25) |
|
||||
(macho::RIT_Pair << 28));
|
||||
|
||||
Writer->addRelocation(Fragment->getParent(), MREPair);
|
||||
}
|
||||
|
@ -16,9 +16,9 @@
|
||||
#include "llvm/MC/MCObjectWriter.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/MC/MCValue.h"
|
||||
#include "llvm/Object/MachOFormat.h"
|
||||
#include "llvm/Support/ELF.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MachO.h"
|
||||
#include "llvm/Support/TargetRegistry.h"
|
||||
using namespace llvm;
|
||||
|
||||
@ -164,8 +164,8 @@ namespace {
|
||||
return createPPCMachObjectWriter(
|
||||
OS,
|
||||
/*Is64Bit=*/is64,
|
||||
(is64 ? MachO::CPU_TYPE_POWERPC64 : MachO::CPU_TYPE_POWERPC),
|
||||
MachO::CPU_SUBTYPE_POWERPC_ALL);
|
||||
(is64 ? object::mach::CTM_PowerPC64 : object::mach::CTM_PowerPC),
|
||||
object::mach::CSPPC_ALL);
|
||||
}
|
||||
|
||||
virtual bool doesSectionRequireSymbols(const MCSection &Section) const {
|
||||
|
@ -16,11 +16,12 @@
|
||||
#include "llvm/MC/MCMachObjectWriter.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/MC/MCValue.h"
|
||||
#include "llvm/Object/MachOFormat.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/Format.h"
|
||||
#include "llvm/Support/MachO.h"
|
||||
|
||||
using namespace llvm;
|
||||
using namespace llvm::object;
|
||||
|
||||
namespace {
|
||||
class PPCMachObjectWriter : public MCMachObjectTargetWriter {
|
||||
@ -89,29 +90,29 @@ static unsigned getRelocType(const MCValue &Target,
|
||||
Target.isAbsolute() ? MCSymbolRefExpr::VK_None
|
||||
: Target.getSymA()->getKind();
|
||||
// determine the type of the relocation
|
||||
unsigned Type = MachO::GENERIC_RELOC_VANILLA;
|
||||
unsigned Type = macho::RIT_Vanilla;
|
||||
if (IsPCRel) { // relative to PC
|
||||
switch ((unsigned)FixupKind) {
|
||||
default:
|
||||
report_fatal_error("Unimplemented fixup kind (relative)");
|
||||
case PPC::fixup_ppc_br24:
|
||||
Type = MachO::PPC_RELOC_BR24; // R_PPC_REL24
|
||||
Type = macho::RIT_PPC_BR24; // R_PPC_REL24
|
||||
break;
|
||||
case PPC::fixup_ppc_brcond14:
|
||||
Type = MachO::PPC_RELOC_BR14;
|
||||
Type = macho::RIT_PPC_BR14;
|
||||
break;
|
||||
case PPC::fixup_ppc_half16:
|
||||
switch (Modifier) {
|
||||
default:
|
||||
llvm_unreachable("Unsupported modifier for half16 fixup");
|
||||
case MCSymbolRefExpr::VK_PPC_HA:
|
||||
Type = MachO::PPC_RELOC_HA16;
|
||||
Type = macho::RIT_PPC_HA16;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_PPC_LO:
|
||||
Type = MachO::PPC_RELOC_LO16;
|
||||
Type = macho::RIT_PPC_LO16;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_PPC_HI:
|
||||
Type = MachO::PPC_RELOC_HI16;
|
||||
Type = macho::RIT_PPC_HI16;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@ -125,13 +126,13 @@ static unsigned getRelocType(const MCValue &Target,
|
||||
default:
|
||||
llvm_unreachable("Unsupported modifier for half16 fixup");
|
||||
case MCSymbolRefExpr::VK_PPC_HA:
|
||||
Type = MachO::PPC_RELOC_HA16_SECTDIFF;
|
||||
Type = macho::RIT_PPC_HA16_SECTDIFF;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_PPC_LO:
|
||||
Type = MachO::PPC_RELOC_LO16_SECTDIFF;
|
||||
Type = macho::RIT_PPC_LO16_SECTDIFF;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_PPC_HI:
|
||||
Type = MachO::PPC_RELOC_HI16_SECTDIFF;
|
||||
Type = macho::RIT_PPC_HI16_SECTDIFF;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@ -144,34 +145,30 @@ static unsigned getRelocType(const MCValue &Target,
|
||||
return Type;
|
||||
}
|
||||
|
||||
static void makeRelocationInfo(MachO::any_relocation_info &MRE,
|
||||
static void makeRelocationInfo(macho::RelocationEntry &MRE,
|
||||
const uint32_t FixupOffset, const uint32_t Index,
|
||||
const unsigned IsPCRel, const unsigned Log2Size,
|
||||
const unsigned IsExtern, const unsigned Type) {
|
||||
MRE.r_word0 = FixupOffset;
|
||||
MRE.Word0 = FixupOffset;
|
||||
// The bitfield offsets that work (as determined by trial-and-error)
|
||||
// are different than what is documented in the mach-o manuals.
|
||||
// This appears to be an endianness issue; reversing the order of the
|
||||
// documented bitfields in <llvm/Support/MachO.h> fixes this (but
|
||||
// breaks x86/ARM assembly).
|
||||
MRE.r_word1 = ((Index << 8) | // was << 0
|
||||
(IsPCRel << 7) | // was << 24
|
||||
(Log2Size << 5) | // was << 25
|
||||
(IsExtern << 4) | // was << 27
|
||||
(Type << 0)); // was << 28
|
||||
// Is this an endianness issue w/ PPC?
|
||||
MRE.Word1 = ((Index << 8) | // was << 0
|
||||
(IsPCRel << 7) | // was << 24
|
||||
(Log2Size << 5) | // was << 25
|
||||
(IsExtern << 4) | // was << 27
|
||||
(Type << 0)); // was << 28
|
||||
}
|
||||
|
||||
static void
|
||||
makeScatteredRelocationInfo(MachO::scattered_relocation_info &MRE,
|
||||
const uint32_t Addr, const unsigned Type,
|
||||
const unsigned Log2Size, const unsigned IsPCRel,
|
||||
const uint32_t Value2) {
|
||||
MRE.r_scattered = true;
|
||||
MRE.r_pcrel = IsPCRel;
|
||||
MRE.r_length = Log2Size;
|
||||
MRE.r_type = Type;
|
||||
MRE.r_address = Addr;
|
||||
MRE.r_value = Value2;
|
||||
makeScatteredRelocationInfo(macho::RelocationEntry &MRE, const uint32_t Addr,
|
||||
const unsigned Type, const unsigned Log2Size,
|
||||
const unsigned IsPCRel, const uint32_t Value2) {
|
||||
// For notes on bitfield positions and endianness, see:
|
||||
// https://developer.apple.com/library/mac/documentation/developertools/conceptual/MachORuntime/Reference/reference.html#//apple_ref/doc/uid/20001298-scattered_relocation_entry
|
||||
MRE.Word0 = ((Addr << 0) | (Type << 24) | (Log2Size << 28) | (IsPCRel << 30) |
|
||||
macho::RF_Scattered);
|
||||
MRE.Word1 = Value2;
|
||||
}
|
||||
|
||||
/// Compute fixup offset (address).
|
||||
@ -226,19 +223,18 @@ bool PPCMachObjectWriter::RecordScatteredRelocation(
|
||||
report_fatal_error("symbol '" + B->getSymbol().getName() +
|
||||
"' can not be undefined in a subtraction expression");
|
||||
|
||||
// FIXME: is Type correct? see include/llvm/Support/MachO.h
|
||||
// FIXME: is Type correct? see include/llvm/Object/MachOFormat.h
|
||||
Value2 = Writer->getSymbolAddress(B_SD, Layout);
|
||||
FixedValue -= Writer->getSectionAddress(B_SD->getFragment()->getParent());
|
||||
}
|
||||
// FIXME: does FixedValue get used??
|
||||
|
||||
// Relocations are written out in reverse order, so the PAIR comes first.
|
||||
if (Type == MachO::PPC_RELOC_SECTDIFF ||
|
||||
Type == MachO::PPC_RELOC_HI16_SECTDIFF ||
|
||||
Type == MachO::PPC_RELOC_LO16_SECTDIFF ||
|
||||
Type == MachO::PPC_RELOC_HA16_SECTDIFF ||
|
||||
Type == MachO::PPC_RELOC_LO14_SECTDIFF ||
|
||||
Type == MachO::PPC_RELOC_LOCAL_SECTDIFF) {
|
||||
if (Type == macho::RIT_PPC_SECTDIFF || Type == macho::RIT_PPC_HI16_SECTDIFF ||
|
||||
Type == macho::RIT_PPC_LO16_SECTDIFF ||
|
||||
Type == macho::RIT_PPC_HA16_SECTDIFF ||
|
||||
Type == macho::RIT_PPC_LO14_SECTDIFF ||
|
||||
Type == macho::RIT_PPC_LOCAL_SECTDIFF) {
|
||||
// X86 had this piece, but ARM does not
|
||||
// If the offset is too large to fit in a scattered relocation,
|
||||
// we're hosed. It's an unfortunate limitation of the MachO format.
|
||||
@ -257,7 +253,7 @@ bool PPCMachObjectWriter::RecordScatteredRelocation(
|
||||
// see PPCMCExpr::EvaluateAsRelocatableImpl()
|
||||
uint32_t other_half = 0;
|
||||
switch (Type) {
|
||||
case MachO::PPC_RELOC_LO16_SECTDIFF:
|
||||
case macho::RIT_PPC_LO16_SECTDIFF:
|
||||
other_half = (FixedValue >> 16) & 0xffff;
|
||||
// applyFixupOffset longer extracts the high part because it now assumes
|
||||
// this was already done.
|
||||
@ -266,12 +262,12 @@ bool PPCMachObjectWriter::RecordScatteredRelocation(
|
||||
// So we need to adjust FixedValue again here.
|
||||
FixedValue &= 0xffff;
|
||||
break;
|
||||
case MachO::PPC_RELOC_HA16_SECTDIFF:
|
||||
case macho::RIT_PPC_HA16_SECTDIFF:
|
||||
other_half = FixedValue & 0xffff;
|
||||
FixedValue =
|
||||
((FixedValue >> 16) + ((FixedValue & 0x8000) ? 1 : 0)) & 0xffff;
|
||||
break;
|
||||
case MachO::PPC_RELOC_HI16_SECTDIFF:
|
||||
case macho::RIT_PPC_HI16_SECTDIFF:
|
||||
other_half = FixedValue & 0xffff;
|
||||
FixedValue = (FixedValue >> 16) & 0xffff;
|
||||
break;
|
||||
@ -280,9 +276,9 @@ bool PPCMachObjectWriter::RecordScatteredRelocation(
|
||||
break;
|
||||
}
|
||||
|
||||
MachO::scattered_relocation_info MRE;
|
||||
makeScatteredRelocationInfo(MRE, other_half, MachO::GENERIC_RELOC_PAIR,
|
||||
Log2Size, IsPCRel, Value2);
|
||||
macho::RelocationEntry MRE;
|
||||
makeScatteredRelocationInfo(MRE, other_half, macho::RIT_Pair, Log2Size,
|
||||
IsPCRel, Value2);
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
} else {
|
||||
// If the offset is more than 24-bits, it won't fit in a scattered
|
||||
@ -295,7 +291,7 @@ bool PPCMachObjectWriter::RecordScatteredRelocation(
|
||||
if (FixupOffset > 0xffffff)
|
||||
return false;
|
||||
}
|
||||
MachO::scattered_relocation_info MRE;
|
||||
macho::RelocationEntry MRE;
|
||||
makeScatteredRelocationInfo(MRE, FixupOffset, Type, Log2Size, IsPCRel, Value);
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
return true;
|
||||
@ -316,8 +312,7 @@ void PPCMachObjectWriter::RecordPPCRelocation(
|
||||
// relocations.
|
||||
if (Target.getSymB() &&
|
||||
// Q: are branch targets ever scattered?
|
||||
RelocType != MachO::PPC_RELOC_BR24 &&
|
||||
RelocType != MachO::PPC_RELOC_BR14) {
|
||||
RelocType != macho::RIT_PPC_BR24 && RelocType != macho::RIT_PPC_BR14) {
|
||||
RecordScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup, Target,
|
||||
Log2Size, FixedValue);
|
||||
return;
|
||||
@ -374,7 +369,8 @@ void PPCMachObjectWriter::RecordPPCRelocation(
|
||||
FixedValue -= Writer->getSectionAddress(Fragment->getParent());
|
||||
}
|
||||
|
||||
MachO::any_relocation_info MRE;
|
||||
// struct relocation_info (8 bytes)
|
||||
macho::RelocationEntry MRE;
|
||||
makeRelocationInfo(MRE, FixupOffset, Index, IsPCRel, Log2Size, IsExtern,
|
||||
Type);
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
|
@ -19,10 +19,10 @@
|
||||
#include "llvm/MC/MCSectionCOFF.h"
|
||||
#include "llvm/MC/MCSectionELF.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/Object/MachOFormat.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/ELF.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MachO.h"
|
||||
#include "llvm/Support/TargetRegistry.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
using namespace llvm;
|
||||
@ -395,8 +395,8 @@ public:
|
||||
|
||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||
return createX86MachObjectWriter(OS, /*Is64Bit=*/false,
|
||||
MachO::CPU_TYPE_I386,
|
||||
MachO::CPU_SUBTYPE_I386_ALL);
|
||||
object::mach::CTM_i386,
|
||||
object::mach::CSX86_ALL);
|
||||
}
|
||||
};
|
||||
|
||||
@ -409,8 +409,8 @@ public:
|
||||
|
||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||
return createX86MachObjectWriter(OS, /*Is64Bit=*/true,
|
||||
MachO::CPU_TYPE_X86_64,
|
||||
MachO::CPU_SUBTYPE_X86_64_ALL);
|
||||
object::mach::CTM_x86_64,
|
||||
object::mach::CSX86_ALL);
|
||||
}
|
||||
|
||||
virtual bool doesSectionRequireSymbols(const MCSection &Section) const {
|
||||
|
@ -17,7 +17,7 @@
|
||||
|
||||
using namespace llvm;
|
||||
using namespace object;
|
||||
using namespace MachO;
|
||||
using namespace macho;
|
||||
|
||||
namespace {
|
||||
class X86_64MachORelocationInfo : public MCRelocationInfo {
|
||||
@ -33,7 +33,7 @@ public:
|
||||
StringRef SymName; SymI->getName(SymName);
|
||||
uint64_t SymAddr; SymI->getAddress(SymAddr);
|
||||
|
||||
any_relocation_info RE = Obj->getRelocation(Rel.getRawDataRefImpl());
|
||||
RelocationEntry RE = Obj->getRelocation(Rel.getRawDataRefImpl());
|
||||
bool isPCRel = Obj->getAnyRelocationPCRel(RE);
|
||||
|
||||
MCSymbol *Sym = Ctx.GetOrCreateSymbol(SymName);
|
||||
@ -43,44 +43,44 @@ public:
|
||||
const MCExpr *Expr = 0;
|
||||
|
||||
switch(RelType) {
|
||||
case X86_64_RELOC_TLV:
|
||||
case RIT_X86_64_TLV:
|
||||
Expr = MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_TLVP, Ctx);
|
||||
break;
|
||||
case X86_64_RELOC_SIGNED_4:
|
||||
case RIT_X86_64_Signed4:
|
||||
Expr = MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(Sym, Ctx),
|
||||
MCConstantExpr::Create(4, Ctx),
|
||||
Ctx);
|
||||
break;
|
||||
case X86_64_RELOC_SIGNED_2:
|
||||
case RIT_X86_64_Signed2:
|
||||
Expr = MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(Sym, Ctx),
|
||||
MCConstantExpr::Create(2, Ctx),
|
||||
Ctx);
|
||||
break;
|
||||
case X86_64_RELOC_SIGNED_1:
|
||||
case RIT_X86_64_Signed1:
|
||||
Expr = MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(Sym, Ctx),
|
||||
MCConstantExpr::Create(1, Ctx),
|
||||
Ctx);
|
||||
break;
|
||||
case X86_64_RELOC_GOT_LOAD:
|
||||
case RIT_X86_64_GOTLoad:
|
||||
Expr = MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOTPCREL, Ctx);
|
||||
break;
|
||||
case X86_64_RELOC_GOT:
|
||||
case RIT_X86_64_GOT:
|
||||
Expr = MCSymbolRefExpr::Create(Sym, isPCRel ?
|
||||
MCSymbolRefExpr::VK_GOTPCREL :
|
||||
MCSymbolRefExpr::VK_GOT,
|
||||
Ctx);
|
||||
break;
|
||||
case X86_64_RELOC_SUBTRACTOR:
|
||||
case RIT_X86_64_Subtractor:
|
||||
{
|
||||
RelocationRef RelNext;
|
||||
Obj->getRelocationNext(Rel.getRawDataRefImpl(), RelNext);
|
||||
any_relocation_info RENext = Obj->getRelocation(RelNext.getRawDataRefImpl());
|
||||
RelocationEntry RENext = Obj->getRelocation(RelNext.getRawDataRefImpl());
|
||||
|
||||
// X86_64_SUBTRACTOR must be followed by a relocation of type
|
||||
// X86_64_RELOC_UNSIGNED.
|
||||
// X86_64_RELOC_UNSIGNED .
|
||||
// NOTE: Scattered relocations don't exist on x86_64.
|
||||
unsigned RType = Obj->getAnyRelocationType(RENext);
|
||||
if (RType != X86_64_RELOC_UNSIGNED)
|
||||
if (RType != RIT_X86_64_Unsigned)
|
||||
report_fatal_error("Expected X86_64_RELOC_UNSIGNED after "
|
||||
"X86_64_RELOC_SUBTRACTOR.");
|
||||
|
||||
|
@ -16,11 +16,12 @@
|
||||
#include "llvm/MC/MCMachObjectWriter.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/MC/MCValue.h"
|
||||
#include "llvm/Object/MachOFormat.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/Format.h"
|
||||
#include "llvm/Support/MachO.h"
|
||||
|
||||
using namespace llvm;
|
||||
using namespace llvm::object;
|
||||
|
||||
namespace {
|
||||
class X86MachObjectWriter : public MCMachObjectTargetWriter {
|
||||
@ -131,7 +132,7 @@ void X86MachObjectWriter::RecordX86_64Relocation(MachObjectWriter *Writer,
|
||||
|
||||
if (Target.isAbsolute()) { // constant
|
||||
// SymbolNum of 0 indicates the absolute section.
|
||||
Type = MachO::X86_64_RELOC_UNSIGNED;
|
||||
Type = macho::RIT_X86_64_Unsigned;
|
||||
Index = 0;
|
||||
|
||||
// FIXME: I believe this is broken, I don't think the linker can understand
|
||||
@ -140,7 +141,7 @@ void X86MachObjectWriter::RecordX86_64Relocation(MachObjectWriter *Writer,
|
||||
// is to use an absolute symbol (which we don't support yet).
|
||||
if (IsPCRel) {
|
||||
IsExtern = 1;
|
||||
Type = MachO::X86_64_RELOC_BRANCH;
|
||||
Type = macho::RIT_X86_64_Branch;
|
||||
}
|
||||
} else if (Target.getSymB()) { // A - B + constant
|
||||
const MCSymbol *A = &Target.getSymA()->getSymbol();
|
||||
@ -192,15 +193,15 @@ void X86MachObjectWriter::RecordX86_64Relocation(MachObjectWriter *Writer,
|
||||
Index = A_SD.getFragment()->getParent()->getOrdinal() + 1;
|
||||
IsExtern = 0;
|
||||
}
|
||||
Type = MachO::X86_64_RELOC_UNSIGNED;
|
||||
Type = macho::RIT_X86_64_Unsigned;
|
||||
|
||||
MachO::relocation_info MRE;
|
||||
MRE.r_address = FixupOffset;
|
||||
MRE.r_symbolnum = Index;
|
||||
MRE.r_pcrel = IsPCRel;
|
||||
MRE.r_length = Log2Size;
|
||||
MRE.r_extern = IsExtern;
|
||||
MRE.r_type = Type;
|
||||
macho::RelocationEntry MRE;
|
||||
MRE.Word0 = FixupOffset;
|
||||
MRE.Word1 = ((Index << 0) |
|
||||
(IsPCRel << 24) |
|
||||
(Log2Size << 25) |
|
||||
(IsExtern << 27) |
|
||||
(Type << 28));
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
|
||||
if (B_Base) {
|
||||
@ -211,7 +212,7 @@ void X86MachObjectWriter::RecordX86_64Relocation(MachObjectWriter *Writer,
|
||||
Index = B_SD.getFragment()->getParent()->getOrdinal() + 1;
|
||||
IsExtern = 0;
|
||||
}
|
||||
Type = MachO::X86_64_RELOC_SUBTRACTOR;
|
||||
Type = macho::RIT_X86_64_Subtractor;
|
||||
} else {
|
||||
const MCSymbol *Symbol = &Target.getSymA()->getSymbol();
|
||||
MCSymbolData &SD = Asm.getSymbolData(*Symbol);
|
||||
@ -271,15 +272,15 @@ void X86MachObjectWriter::RecordX86_64Relocation(MachObjectWriter *Writer,
|
||||
// rewrite the movq to an leaq at link time if the symbol ends up in
|
||||
// the same linkage unit.
|
||||
if (unsigned(Fixup.getKind()) == X86::reloc_riprel_4byte_movq_load)
|
||||
Type = MachO::X86_64_RELOC_GOT_LOAD;
|
||||
Type = macho::RIT_X86_64_GOTLoad;
|
||||
else
|
||||
Type = MachO::X86_64_RELOC_GOT;
|
||||
Type = macho::RIT_X86_64_GOT;
|
||||
} else if (Modifier == MCSymbolRefExpr::VK_TLVP) {
|
||||
Type = MachO::X86_64_RELOC_TLV;
|
||||
Type = macho::RIT_X86_64_TLV;
|
||||
} else if (Modifier != MCSymbolRefExpr::VK_None) {
|
||||
report_fatal_error("unsupported symbol modifier in relocation");
|
||||
} else {
|
||||
Type = MachO::X86_64_RELOC_SIGNED;
|
||||
Type = macho::RIT_X86_64_Signed;
|
||||
|
||||
// The Darwin x86_64 relocation format has a problem where it cannot
|
||||
// encode an address (L<foo> + <constant>) which is outside the atom
|
||||
@ -296,9 +297,9 @@ void X86MachObjectWriter::RecordX86_64Relocation(MachObjectWriter *Writer,
|
||||
// (the additional bias), but instead appear to just look at the final
|
||||
// offset.
|
||||
switch (-(Target.getConstant() + (1LL << Log2Size))) {
|
||||
case 1: Type = MachO::X86_64_RELOC_SIGNED_1; break;
|
||||
case 2: Type = MachO::X86_64_RELOC_SIGNED_2; break;
|
||||
case 4: Type = MachO::X86_64_RELOC_SIGNED_4; break;
|
||||
case 1: Type = macho::RIT_X86_64_Signed1; break;
|
||||
case 2: Type = macho::RIT_X86_64_Signed2; break;
|
||||
case 4: Type = macho::RIT_X86_64_Signed4; break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -306,24 +307,24 @@ void X86MachObjectWriter::RecordX86_64Relocation(MachObjectWriter *Writer,
|
||||
report_fatal_error("unsupported symbol modifier in branch "
|
||||
"relocation");
|
||||
|
||||
Type = MachO::X86_64_RELOC_BRANCH;
|
||||
Type = macho::RIT_X86_64_Branch;
|
||||
}
|
||||
} else {
|
||||
if (Modifier == MCSymbolRefExpr::VK_GOT) {
|
||||
Type = MachO::X86_64_RELOC_GOT;
|
||||
Type = macho::RIT_X86_64_GOT;
|
||||
} else if (Modifier == MCSymbolRefExpr::VK_GOTPCREL) {
|
||||
// GOTPCREL is allowed as a modifier on non-PCrel instructions, in which
|
||||
// case all we do is set the PCrel bit in the relocation entry; this is
|
||||
// used with exception handling, for example. The source is required to
|
||||
// include any necessary offset directly.
|
||||
Type = MachO::X86_64_RELOC_GOT;
|
||||
Type = macho::RIT_X86_64_GOT;
|
||||
IsPCRel = 1;
|
||||
} else if (Modifier == MCSymbolRefExpr::VK_TLVP) {
|
||||
report_fatal_error("TLVP symbol modifier should have been rip-rel");
|
||||
} else if (Modifier != MCSymbolRefExpr::VK_None)
|
||||
report_fatal_error("unsupported symbol modifier in relocation");
|
||||
else
|
||||
Type = MachO::X86_64_RELOC_UNSIGNED;
|
||||
Type = macho::RIT_X86_64_Unsigned;
|
||||
}
|
||||
}
|
||||
|
||||
@ -331,13 +332,13 @@ void X86MachObjectWriter::RecordX86_64Relocation(MachObjectWriter *Writer,
|
||||
FixedValue = Value;
|
||||
|
||||
// struct relocation_info (8 bytes)
|
||||
MachO::relocation_info MRE;
|
||||
MRE.r_address = FixupOffset;
|
||||
MRE.r_symbolnum = Index;
|
||||
MRE.r_pcrel = IsPCRel;
|
||||
MRE.r_length = Log2Size;
|
||||
MRE.r_extern = IsExtern;
|
||||
MRE.r_type = Type;
|
||||
macho::RelocationEntry MRE;
|
||||
MRE.Word0 = FixupOffset;
|
||||
MRE.Word1 = ((Index << 0) |
|
||||
(IsPCRel << 24) |
|
||||
(Log2Size << 25) |
|
||||
(IsExtern << 27) |
|
||||
(Type << 28));
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
}
|
||||
|
||||
@ -351,7 +352,7 @@ bool X86MachObjectWriter::RecordScatteredRelocation(MachObjectWriter *Writer,
|
||||
uint64_t &FixedValue) {
|
||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
||||
unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
|
||||
unsigned Type = MachO::GENERIC_RELOC_VANILLA;
|
||||
unsigned Type = macho::RIT_Vanilla;
|
||||
|
||||
// See <reloc.h>.
|
||||
const MCSymbol *A = &Target.getSymA()->getSymbol();
|
||||
@ -378,16 +379,15 @@ bool X86MachObjectWriter::RecordScatteredRelocation(MachObjectWriter *Writer,
|
||||
// Note that there is no longer any semantic difference between these two
|
||||
// relocation types from the linkers point of view, this is done solely for
|
||||
// pedantic compatibility with 'as'.
|
||||
Type = A_SD->isExternal() ? (unsigned)MachO::GENERIC_RELOC_SECTDIFF :
|
||||
(unsigned)MachO::GENERIC_RELOC_LOCAL_SECTDIFF;
|
||||
Type = A_SD->isExternal() ? (unsigned)macho::RIT_Difference :
|
||||
(unsigned)macho::RIT_Generic_LocalDifference;
|
||||
Value2 = Writer->getSymbolAddress(B_SD, Layout);
|
||||
FixedValue -= Writer->getSectionAddress(B_SD->getFragment()->getParent());
|
||||
}
|
||||
|
||||
MachO::scattered_relocation_info MRE;
|
||||
// Relocations are written out in reverse order, so the PAIR comes first.
|
||||
if (Type == MachO::GENERIC_RELOC_SECTDIFF ||
|
||||
Type == MachO::GENERIC_RELOC_LOCAL_SECTDIFF) {
|
||||
if (Type == macho::RIT_Difference ||
|
||||
Type == macho::RIT_Generic_LocalDifference) {
|
||||
// If the offset is too large to fit in a scattered relocation,
|
||||
// we're hosed. It's an unfortunate limitation of the MachO format.
|
||||
if (FixupOffset > 0xffffff) {
|
||||
@ -401,12 +401,13 @@ bool X86MachObjectWriter::RecordScatteredRelocation(MachObjectWriter *Writer,
|
||||
llvm_unreachable("fatal error returned?!");
|
||||
}
|
||||
|
||||
MRE.r_address = 0;
|
||||
MRE.r_type = MachO::GENERIC_RELOC_PAIR;
|
||||
MRE.r_length = Log2Size;
|
||||
MRE.r_pcrel = IsPCRel;
|
||||
MRE.r_scattered = 1;
|
||||
MRE.r_value = Value2;
|
||||
macho::RelocationEntry MRE;
|
||||
MRE.Word0 = ((0 << 0) |
|
||||
(macho::RIT_Pair << 24) |
|
||||
(Log2Size << 28) |
|
||||
(IsPCRel << 30) |
|
||||
macho::RF_Scattered);
|
||||
MRE.Word1 = Value2;
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
} else {
|
||||
// If the offset is more than 24-bits, it won't fit in a scattered
|
||||
@ -420,12 +421,13 @@ bool X86MachObjectWriter::RecordScatteredRelocation(MachObjectWriter *Writer,
|
||||
return false;
|
||||
}
|
||||
|
||||
MRE.r_address = FixupOffset;
|
||||
MRE.r_type = Type;
|
||||
MRE.r_length = Log2Size;
|
||||
MRE.r_pcrel = IsPCRel;
|
||||
MRE.r_scattered = 1;
|
||||
MRE.r_value = Value;
|
||||
macho::RelocationEntry MRE;
|
||||
MRE.Word0 = ((FixupOffset << 0) |
|
||||
(Type << 24) |
|
||||
(Log2Size << 28) |
|
||||
(IsPCRel << 30) |
|
||||
macho::RF_Scattered);
|
||||
MRE.Word1 = Value;
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
return true;
|
||||
}
|
||||
@ -467,13 +469,13 @@ void X86MachObjectWriter::RecordTLVPRelocation(MachObjectWriter *Writer,
|
||||
}
|
||||
|
||||
// struct relocation_info (8 bytes)
|
||||
MachO::relocation_info MRE;
|
||||
MRE.r_address = Value;
|
||||
MRE.r_symbolnum = Index;
|
||||
MRE.r_pcrel = IsPCRel;
|
||||
MRE.r_length = Log2Size;
|
||||
MRE.r_extern = 1;
|
||||
MRE.r_type = MachO::GENERIC_RELOC_TLV;
|
||||
macho::RelocationEntry MRE;
|
||||
MRE.Word0 = Value;
|
||||
MRE.Word1 = ((Index << 0) |
|
||||
(IsPCRel << 24) |
|
||||
(Log2Size << 25) |
|
||||
(1 << 27) | // Extern
|
||||
(macho::RIT_Generic_TLV << 28)); // Type
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
}
|
||||
|
||||
@ -533,7 +535,7 @@ void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
|
||||
//
|
||||
// FIXME: Currently, these are never generated (see code below). I cannot
|
||||
// find a case where they are actually emitted.
|
||||
Type = MachO::GENERIC_RELOC_VANILLA;
|
||||
Type = macho::RIT_Vanilla;
|
||||
} else {
|
||||
// Resolve constant variables.
|
||||
if (SD->getSymbol().isVariable()) {
|
||||
@ -564,17 +566,17 @@ void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
|
||||
if (IsPCRel)
|
||||
FixedValue -= Writer->getSectionAddress(Fragment->getParent());
|
||||
|
||||
Type = MachO::GENERIC_RELOC_VANILLA;
|
||||
Type = macho::RIT_Vanilla;
|
||||
}
|
||||
|
||||
// struct relocation_info (8 bytes)
|
||||
MachO::relocation_info MRE;
|
||||
MRE.r_address = FixupOffset;
|
||||
MRE.r_symbolnum = Index;
|
||||
MRE.r_pcrel = IsPCRel;
|
||||
MRE.r_length = Log2Size;
|
||||
MRE.r_extern = IsExtern;
|
||||
MRE.r_type = Type;
|
||||
macho::RelocationEntry MRE;
|
||||
MRE.Word0 = FixupOffset;
|
||||
MRE.Word1 = ((Index << 0) |
|
||||
(IsPCRel << 24) |
|
||||
(Log2Size << 25) |
|
||||
(IsExtern << 27) |
|
||||
(Type << 28));
|
||||
Writer->addRelocation(Fragment->getParent(), MRE);
|
||||
}
|
||||
|
||||
|
@ -104,7 +104,7 @@ static void DumpDataInCode(const char *bytes, uint64_t Size,
|
||||
uint64_t Value;
|
||||
|
||||
switch (Kind) {
|
||||
case MachO::DICE_KIND_DATA:
|
||||
case macho::Data:
|
||||
switch (Size) {
|
||||
case 4:
|
||||
Value = bytes[3] << 24 |
|
||||
@ -125,16 +125,16 @@ static void DumpDataInCode(const char *bytes, uint64_t Size,
|
||||
}
|
||||
outs() << "\t@ KIND_DATA\n";
|
||||
break;
|
||||
case MachO::DICE_KIND_JUMP_TABLE8:
|
||||
case macho::JumpTable8:
|
||||
Value = bytes[0];
|
||||
outs() << "\t.byte " << Value << "\t@ KIND_JUMP_TABLE8";
|
||||
break;
|
||||
case MachO::DICE_KIND_JUMP_TABLE16:
|
||||
case macho::JumpTable16:
|
||||
Value = bytes[1] << 8 |
|
||||
bytes[0];
|
||||
outs() << "\t.short " << Value << "\t@ KIND_JUMP_TABLE16";
|
||||
break;
|
||||
case MachO::DICE_KIND_JUMP_TABLE32:
|
||||
case macho::JumpTable32:
|
||||
Value = bytes[3] << 24 |
|
||||
bytes[2] << 16 |
|
||||
bytes[1] << 8 |
|
||||
@ -148,7 +148,7 @@ static void DumpDataInCode(const char *bytes, uint64_t Size,
|
||||
}
|
||||
|
||||
static void
|
||||
getSectionsAndSymbols(const MachO::mach_header Header,
|
||||
getSectionsAndSymbols(const macho::Header Header,
|
||||
MachOObjectFile *MachOObj,
|
||||
std::vector<SectionRef> &Sections,
|
||||
std::vector<SymbolRef> &Symbols,
|
||||
@ -171,26 +171,25 @@ getSectionsAndSymbols(const MachO::mach_header Header,
|
||||
MachOObj->getFirstLoadCommandInfo();
|
||||
bool BaseSegmentAddressSet = false;
|
||||
for (unsigned i = 0; ; ++i) {
|
||||
if (Command.C.cmd == MachO::LC_FUNCTION_STARTS) {
|
||||
if (Command.C.Type == macho::LCT_FunctionStarts) {
|
||||
// We found a function starts segment, parse the addresses for later
|
||||
// consumption.
|
||||
MachO::linkedit_data_command LLC =
|
||||
macho::LinkeditDataLoadCommand LLC =
|
||||
MachOObj->getLinkeditDataLoadCommand(Command);
|
||||
|
||||
MachOObj->ReadULEB128s(LLC.dataoff, FoundFns);
|
||||
MachOObj->ReadULEB128s(LLC.DataOffset, FoundFns);
|
||||
}
|
||||
else if (Command.C.cmd == MachO::LC_SEGMENT ||
|
||||
Command.C.cmd == MachO::LC_SEGMENT_64) {
|
||||
MachO::segment_command SLC =
|
||||
else if (Command.C.Type == macho::LCT_Segment) {
|
||||
macho::SegmentLoadCommand SLC =
|
||||
MachOObj->getSegmentLoadCommand(Command);
|
||||
StringRef SegName = SLC.segname;
|
||||
StringRef SegName = SLC.Name;
|
||||
if(!BaseSegmentAddressSet && SegName != "__PAGEZERO") {
|
||||
BaseSegmentAddressSet = true;
|
||||
BaseSegmentAddress = SLC.vmaddr;
|
||||
BaseSegmentAddress = SLC.VMAddress;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == Header.ncmds - 1)
|
||||
if (i == Header.NumLoadCommands - 1)
|
||||
break;
|
||||
else
|
||||
Command = MachOObj->getNextLoadCommandInfo(Command);
|
||||
@ -245,7 +244,7 @@ static void DisassembleInputMachO2(StringRef Filename,
|
||||
|
||||
outs() << '\n' << Filename << ":\n\n";
|
||||
|
||||
MachO::mach_header Header = MachOOF->getHeader();
|
||||
macho::Header Header = MachOOF->getHeader();
|
||||
|
||||
// FIXME: FoundFns isn't used anymore. Using symbols/LC_FUNCTION_STARTS to
|
||||
// determine function locations will eventually go in MCObjectDisassembler.
|
||||
@ -268,7 +267,7 @@ static void DisassembleInputMachO2(StringRef Filename,
|
||||
|
||||
// Build a data in code table that is sorted on by the address of each entry.
|
||||
uint64_t BaseAddress = 0;
|
||||
if (Header.filetype == MachO::MH_OBJECT)
|
||||
if (Header.FileType == macho::HFT_Object)
|
||||
Sections[0].getAddress(BaseAddress);
|
||||
else
|
||||
BaseAddress = BaseSegmentAddress;
|
||||
|
@ -166,28 +166,28 @@ static void getSection(const MachOObjectFile *Obj,
|
||||
DataRefImpl Sec,
|
||||
MachOSection &Section) {
|
||||
if (!Obj->is64Bit()) {
|
||||
MachO::section Sect = Obj->getSection(Sec);
|
||||
Section.Address = Sect.addr;
|
||||
Section.Size = Sect.size;
|
||||
Section.Offset = Sect.offset;
|
||||
Section.Alignment = Sect.align;
|
||||
Section.RelocationTableOffset = Sect.reloff;
|
||||
Section.NumRelocationTableEntries = Sect.nreloc;
|
||||
Section.Flags = Sect.flags;
|
||||
Section.Reserved1 = Sect.reserved1;
|
||||
Section.Reserved2 = Sect.reserved2;
|
||||
macho::Section Sect = Obj->getSection(Sec);
|
||||
Section.Address = Sect.Address;
|
||||
Section.Size = Sect.Size;
|
||||
Section.Offset = Sect.Offset;
|
||||
Section.Alignment = Sect.Align;
|
||||
Section.RelocationTableOffset = Sect.RelocationTableOffset;
|
||||
Section.NumRelocationTableEntries = Sect.NumRelocationTableEntries;
|
||||
Section.Flags = Sect.Flags;
|
||||
Section.Reserved1 = Sect.Reserved1;
|
||||
Section.Reserved2 = Sect.Reserved2;
|
||||
return;
|
||||
}
|
||||
MachO::section_64 Sect = Obj->getSection64(Sec);
|
||||
Section.Address = Sect.addr;
|
||||
Section.Size = Sect.size;
|
||||
Section.Offset = Sect.offset;
|
||||
Section.Alignment = Sect.align;
|
||||
Section.RelocationTableOffset = Sect.reloff;
|
||||
Section.NumRelocationTableEntries = Sect.nreloc;
|
||||
Section.Flags = Sect.flags;
|
||||
Section.Reserved1 = Sect.reserved1;
|
||||
Section.Reserved2 = Sect.reserved2;
|
||||
macho::Section64 Sect = Obj->getSection64(Sec);
|
||||
Section.Address = Sect.Address;
|
||||
Section.Size = Sect.Size;
|
||||
Section.Offset = Sect.Offset;
|
||||
Section.Alignment = Sect.Align;
|
||||
Section.RelocationTableOffset = Sect.RelocationTableOffset;
|
||||
Section.NumRelocationTableEntries = Sect.NumRelocationTableEntries;
|
||||
Section.Flags = Sect.Flags;
|
||||
Section.Reserved1 = Sect.Reserved1;
|
||||
Section.Reserved2 = Sect.Reserved2;
|
||||
}
|
||||
|
||||
|
||||
@ -195,20 +195,20 @@ static void getSymbol(const MachOObjectFile *Obj,
|
||||
DataRefImpl DRI,
|
||||
MachOSymbol &Symbol) {
|
||||
if (!Obj->is64Bit()) {
|
||||
MachO::nlist Entry = Obj->getSymbolTableEntry(DRI);
|
||||
Symbol.StringIndex = Entry.n_strx;
|
||||
Symbol.Type = Entry.n_type;
|
||||
Symbol.SectionIndex = Entry.n_sect;
|
||||
Symbol.Flags = Entry.n_desc;
|
||||
Symbol.Value = Entry.n_value;
|
||||
macho::SymbolTableEntry Entry = Obj->getSymbolTableEntry(DRI);
|
||||
Symbol.StringIndex = Entry.StringIndex;
|
||||
Symbol.Type = Entry.Type;
|
||||
Symbol.SectionIndex = Entry.SectionIndex;
|
||||
Symbol.Flags = Entry.Flags;
|
||||
Symbol.Value = Entry.Value;
|
||||
return;
|
||||
}
|
||||
MachO::nlist_64 Entry = Obj->getSymbol64TableEntry(DRI);
|
||||
Symbol.StringIndex = Entry.n_strx;
|
||||
Symbol.Type = Entry.n_type;
|
||||
Symbol.SectionIndex = Entry.n_sect;
|
||||
Symbol.Flags = Entry.n_desc;
|
||||
Symbol.Value = Entry.n_value;
|
||||
macho::Symbol64TableEntry Entry = Obj->getSymbol64TableEntry(DRI);
|
||||
Symbol.StringIndex = Entry.StringIndex;
|
||||
Symbol.Type = Entry.Type;
|
||||
Symbol.SectionIndex = Entry.SectionIndex;
|
||||
Symbol.Flags = Entry.Flags;
|
||||
Symbol.Value = Entry.Value;
|
||||
}
|
||||
|
||||
void MachODumper::printFileHeaders() {
|
||||
@ -349,7 +349,7 @@ void MachODumper::printRelocation(const MachOObjectFile *Obj,
|
||||
return;
|
||||
|
||||
DataRefImpl DR = RelI->getRawDataRefImpl();
|
||||
MachO::any_relocation_info RE = Obj->getRelocation(DR);
|
||||
macho::RelocationEntry RE = Obj->getRelocation(DR);
|
||||
bool IsScattered = Obj->isRelocationScattered(RE);
|
||||
|
||||
if (opts::ExpandRelocs) {
|
||||
|
@ -99,10 +99,10 @@ static int DumpSectionData(const MachOObjectFile &Obj, unsigned Index,
|
||||
error_code EC;
|
||||
for (relocation_iterator I = Obj.getSectionRelBegin(Index),
|
||||
E = Obj.getSectionRelEnd(Index); I != E; I.increment(EC), ++RelNum) {
|
||||
MachO::any_relocation_info RE = Obj.getRelocation(I->getRawDataRefImpl());
|
||||
macho::RelocationEntry RE = Obj.getRelocation(I->getRawDataRefImpl());
|
||||
outs() << " # Relocation " << RelNum << "\n";
|
||||
outs() << " (('word-0', " << format("0x%x", RE.r_word0) << "),\n";
|
||||
outs() << " ('word-1', " << format("0x%x", RE.r_word1) << ")),\n";
|
||||
outs() << " (('word-0', " << format("0x%x", RE.Word0) << "),\n";
|
||||
outs() << " ('word-1', " << format("0x%x", RE.Word1) << ")),\n";
|
||||
}
|
||||
outs() << " ])\n";
|
||||
|
||||
@ -124,21 +124,23 @@ static int DumpSectionData(const MachOObjectFile &Obj, unsigned Index,
|
||||
|
||||
static int DumpSegmentCommand(const MachOObjectFile &Obj,
|
||||
const MachOObjectFile::LoadCommandInfo &LCI) {
|
||||
MachO::segment_command SLC = Obj.getSegmentLoadCommand(LCI);
|
||||
macho::SegmentLoadCommand SLC = Obj.getSegmentLoadCommand(LCI);
|
||||
|
||||
DumpSegmentCommandData(StringRef(SLC.segname, 16), SLC.vmaddr,
|
||||
SLC.vmsize, SLC.fileoff, SLC.filesize,
|
||||
SLC.maxprot, SLC.initprot, SLC.nsects, SLC.flags);
|
||||
DumpSegmentCommandData(StringRef(SLC.Name, 16), SLC.VMAddress,
|
||||
SLC.VMSize, SLC.FileOffset, SLC.FileSize,
|
||||
SLC.MaxVMProtection, SLC.InitialVMProtection,
|
||||
SLC.NumSections, SLC.Flags);
|
||||
|
||||
// Dump the sections.
|
||||
outs() << " ('sections', [\n";
|
||||
for (unsigned i = 0; i != SLC.nsects; ++i) {
|
||||
MachO::section Sect = Obj.getSection(LCI, i);
|
||||
DumpSectionData(Obj, i, StringRef(Sect.sectname, 16),
|
||||
StringRef(Sect.segname, 16), Sect.addr,
|
||||
Sect.size, Sect.offset, Sect.align,
|
||||
Sect.reloff, Sect.nreloc, Sect.flags,
|
||||
Sect.reserved1, Sect.reserved2);
|
||||
for (unsigned i = 0; i != SLC.NumSections; ++i) {
|
||||
macho::Section Sect = Obj.getSection(LCI, i);
|
||||
DumpSectionData(Obj, i, StringRef(Sect.Name, 16),
|
||||
StringRef(Sect.SegmentName, 16), Sect.Address,
|
||||
Sect.Size, Sect.Offset, Sect.Align,
|
||||
Sect.RelocationTableOffset,
|
||||
Sect.NumRelocationTableEntries, Sect.Flags,
|
||||
Sect.Reserved1, Sect.Reserved2);
|
||||
}
|
||||
outs() << " ])\n";
|
||||
|
||||
@ -147,22 +149,24 @@ static int DumpSegmentCommand(const MachOObjectFile &Obj,
|
||||
|
||||
static int DumpSegment64Command(const MachOObjectFile &Obj,
|
||||
const MachOObjectFile::LoadCommandInfo &LCI) {
|
||||
MachO::segment_command_64 SLC = Obj.getSegment64LoadCommand(LCI);
|
||||
DumpSegmentCommandData(StringRef(SLC.segname, 16), SLC.vmaddr,
|
||||
SLC.vmsize, SLC.fileoff, SLC.filesize,
|
||||
SLC.maxprot, SLC.initprot, SLC.nsects, SLC.flags);
|
||||
macho::Segment64LoadCommand SLC = Obj.getSegment64LoadCommand(LCI);
|
||||
DumpSegmentCommandData(StringRef(SLC.Name, 16), SLC.VMAddress,
|
||||
SLC.VMSize, SLC.FileOffset, SLC.FileSize,
|
||||
SLC.MaxVMProtection, SLC.InitialVMProtection,
|
||||
SLC.NumSections, SLC.Flags);
|
||||
|
||||
// Dump the sections.
|
||||
outs() << " ('sections', [\n";
|
||||
for (unsigned i = 0; i != SLC.nsects; ++i) {
|
||||
MachO::section_64 Sect = Obj.getSection64(LCI, i);
|
||||
for (unsigned i = 0; i != SLC.NumSections; ++i) {
|
||||
macho::Section64 Sect = Obj.getSection64(LCI, i);
|
||||
|
||||
DumpSectionData(Obj, i, StringRef(Sect.sectname, 16),
|
||||
StringRef(Sect.segname, 16), Sect.addr,
|
||||
Sect.size, Sect.offset, Sect.align,
|
||||
Sect.reloff, Sect.nreloc, Sect.flags,
|
||||
Sect.reserved1, Sect.reserved2,
|
||||
Sect.reserved3);
|
||||
DumpSectionData(Obj, i, StringRef(Sect.Name, 16),
|
||||
StringRef(Sect.SegmentName, 16), Sect.Address,
|
||||
Sect.Size, Sect.Offset, Sect.Align,
|
||||
Sect.RelocationTableOffset,
|
||||
Sect.NumRelocationTableEntries, Sect.Flags,
|
||||
Sect.Reserved1, Sect.Reserved2,
|
||||
Sect.Reserved3);
|
||||
}
|
||||
outs() << " ])\n";
|
||||
|
||||
@ -186,12 +190,12 @@ static void DumpSymbolTableEntryData(const MachOObjectFile &Obj,
|
||||
}
|
||||
|
||||
static int DumpSymtabCommand(const MachOObjectFile &Obj) {
|
||||
MachO::symtab_command SLC = Obj.getSymtabLoadCommand();
|
||||
macho::SymtabLoadCommand SLC = Obj.getSymtabLoadCommand();
|
||||
|
||||
outs() << " ('symoff', " << SLC.symoff << ")\n";
|
||||
outs() << " ('nsyms', " << SLC.nsyms << ")\n";
|
||||
outs() << " ('stroff', " << SLC.stroff << ")\n";
|
||||
outs() << " ('strsize', " << SLC.strsize << ")\n";
|
||||
outs() << " ('symoff', " << SLC.SymbolTableOffset << ")\n";
|
||||
outs() << " ('nsyms', " << SLC.NumSymbolTableEntries << ")\n";
|
||||
outs() << " ('stroff', " << SLC.StringTableOffset << ")\n";
|
||||
outs() << " ('strsize', " << SLC.StringTableSize << ")\n";
|
||||
|
||||
// Dump the string data.
|
||||
outs() << " ('_string_data', '";
|
||||
@ -207,14 +211,14 @@ static int DumpSymtabCommand(const MachOObjectFile &Obj) {
|
||||
I.increment(EC), ++SymNum) {
|
||||
DataRefImpl DRI = I->getRawDataRefImpl();
|
||||
if (Obj.is64Bit()) {
|
||||
MachO::nlist_64 STE = Obj.getSymbol64TableEntry(DRI);
|
||||
DumpSymbolTableEntryData(Obj, SymNum, STE.n_strx, STE.n_type,
|
||||
STE.n_sect, STE.n_desc, STE.n_value,
|
||||
macho::Symbol64TableEntry STE = Obj.getSymbol64TableEntry(DRI);
|
||||
DumpSymbolTableEntryData(Obj, SymNum, STE.StringIndex, STE.Type,
|
||||
STE.SectionIndex, STE.Flags, STE.Value,
|
||||
StringTable);
|
||||
} else {
|
||||
MachO::nlist STE = Obj.getSymbolTableEntry(DRI);
|
||||
DumpSymbolTableEntryData(Obj, SymNum, STE.n_strx, STE.n_type,
|
||||
STE.n_sect, STE.n_desc, STE.n_value,
|
||||
macho::SymbolTableEntry STE = Obj.getSymbolTableEntry(DRI);
|
||||
DumpSymbolTableEntryData(Obj, SymNum, STE.StringIndex, STE.Type,
|
||||
STE.SectionIndex, STE.Flags, STE.Value,
|
||||
StringTable);
|
||||
}
|
||||
}
|
||||
@ -224,33 +228,37 @@ static int DumpSymtabCommand(const MachOObjectFile &Obj) {
|
||||
}
|
||||
|
||||
static int DumpDysymtabCommand(const MachOObjectFile &Obj) {
|
||||
MachO::dysymtab_command DLC = Obj.getDysymtabLoadCommand();
|
||||
macho::DysymtabLoadCommand DLC = Obj.getDysymtabLoadCommand();
|
||||
|
||||
outs() << " ('ilocalsym', " << DLC.ilocalsym << ")\n";
|
||||
outs() << " ('nlocalsym', " << DLC.nlocalsym << ")\n";
|
||||
outs() << " ('iextdefsym', " << DLC.iextdefsym << ")\n";
|
||||
outs() << " ('nextdefsym', " << DLC.nextdefsym << ")\n";
|
||||
outs() << " ('iundefsym', " << DLC.iundefsym << ")\n";
|
||||
outs() << " ('nundefsym', " << DLC.nundefsym << ")\n";
|
||||
outs() << " ('tocoff', " << DLC.tocoff << ")\n";
|
||||
outs() << " ('ntoc', " << DLC.ntoc << ")\n";
|
||||
outs() << " ('modtaboff', " << DLC.modtaboff << ")\n";
|
||||
outs() << " ('nmodtab', " << DLC.nmodtab << ")\n";
|
||||
outs() << " ('extrefsymoff', " << DLC.extrefsymoff << ")\n";
|
||||
outs() << " ('nextrefsyms', " << DLC.nextrefsyms << ")\n";
|
||||
outs() << " ('indirectsymoff', " << DLC.indirectsymoff << ")\n";
|
||||
outs() << " ('nindirectsyms', " << DLC.nindirectsyms << ")\n";
|
||||
outs() << " ('extreloff', " << DLC.extreloff << ")\n";
|
||||
outs() << " ('nextrel', " << DLC.nextrel << ")\n";
|
||||
outs() << " ('locreloff', " << DLC.locreloff << ")\n";
|
||||
outs() << " ('nlocrel', " << DLC.nlocrel << ")\n";
|
||||
outs() << " ('ilocalsym', " << DLC.LocalSymbolsIndex << ")\n";
|
||||
outs() << " ('nlocalsym', " << DLC.NumLocalSymbols << ")\n";
|
||||
outs() << " ('iextdefsym', " << DLC.ExternalSymbolsIndex << ")\n";
|
||||
outs() << " ('nextdefsym', " << DLC.NumExternalSymbols << ")\n";
|
||||
outs() << " ('iundefsym', " << DLC.UndefinedSymbolsIndex << ")\n";
|
||||
outs() << " ('nundefsym', " << DLC.NumUndefinedSymbols << ")\n";
|
||||
outs() << " ('tocoff', " << DLC.TOCOffset << ")\n";
|
||||
outs() << " ('ntoc', " << DLC.NumTOCEntries << ")\n";
|
||||
outs() << " ('modtaboff', " << DLC.ModuleTableOffset << ")\n";
|
||||
outs() << " ('nmodtab', " << DLC.NumModuleTableEntries << ")\n";
|
||||
outs() << " ('extrefsymoff', " << DLC.ReferenceSymbolTableOffset << ")\n";
|
||||
outs() << " ('nextrefsyms', "
|
||||
<< DLC.NumReferencedSymbolTableEntries << ")\n";
|
||||
outs() << " ('indirectsymoff', " << DLC.IndirectSymbolTableOffset << ")\n";
|
||||
outs() << " ('nindirectsyms', "
|
||||
<< DLC.NumIndirectSymbolTableEntries << ")\n";
|
||||
outs() << " ('extreloff', " << DLC.ExternalRelocationTableOffset << ")\n";
|
||||
outs() << " ('nextrel', " << DLC.NumExternalRelocationTableEntries << ")\n";
|
||||
outs() << " ('locreloff', " << DLC.LocalRelocationTableOffset << ")\n";
|
||||
outs() << " ('nlocrel', " << DLC.NumLocalRelocationTableEntries << ")\n";
|
||||
|
||||
// Dump the indirect symbol table.
|
||||
outs() << " ('_indirect_symbols', [\n";
|
||||
for (unsigned i = 0; i != DLC.nindirectsyms; ++i) {
|
||||
uint32_t ISTE = Obj.getIndirectSymbolTableEntry(DLC, i);
|
||||
for (unsigned i = 0; i != DLC.NumIndirectSymbolTableEntries; ++i) {
|
||||
macho::IndirectSymbolTableEntry ISTE =
|
||||
Obj.getIndirectSymbolTableEntry(DLC, i);
|
||||
outs() << " # Indirect Symbol " << i << "\n";
|
||||
outs() << " (('symbol_index', " << format("0x%x", ISTE) << "),),\n";
|
||||
outs() << " (('symbol_index', "
|
||||
<< format("0x%x", ISTE.Index) << "),),\n";
|
||||
}
|
||||
outs() << " ])\n";
|
||||
|
||||
@ -260,13 +268,13 @@ static int DumpDysymtabCommand(const MachOObjectFile &Obj) {
|
||||
static int
|
||||
DumpLinkeditDataCommand(const MachOObjectFile &Obj,
|
||||
const MachOObjectFile::LoadCommandInfo &LCI) {
|
||||
MachO::linkedit_data_command LLC = Obj.getLinkeditDataLoadCommand(LCI);
|
||||
outs() << " ('dataoff', " << LLC.dataoff << ")\n"
|
||||
<< " ('datasize', " << LLC.datasize << ")\n"
|
||||
macho::LinkeditDataLoadCommand LLC = Obj.getLinkeditDataLoadCommand(LCI);
|
||||
outs() << " ('dataoff', " << LLC.DataOffset << ")\n"
|
||||
<< " ('datasize', " << LLC.DataSize << ")\n"
|
||||
<< " ('_addresses', [\n";
|
||||
|
||||
SmallVector<uint64_t, 8> Addresses;
|
||||
Obj.ReadULEB128s(LLC.dataoff, Addresses);
|
||||
Obj.ReadULEB128s(LLC.DataOffset, Addresses);
|
||||
for (unsigned i = 0, e = Addresses.size(); i != e; ++i)
|
||||
outs() << " # Address " << i << '\n'
|
||||
<< " ('address', " << format("0x%x", Addresses[i]) << "),\n";
|
||||
@ -279,18 +287,19 @@ DumpLinkeditDataCommand(const MachOObjectFile &Obj,
|
||||
static int
|
||||
DumpDataInCodeDataCommand(const MachOObjectFile &Obj,
|
||||
const MachOObjectFile::LoadCommandInfo &LCI) {
|
||||
MachO::linkedit_data_command LLC = Obj.getLinkeditDataLoadCommand(LCI);
|
||||
outs() << " ('dataoff', " << LLC.dataoff << ")\n"
|
||||
<< " ('datasize', " << LLC.datasize << ")\n"
|
||||
macho::LinkeditDataLoadCommand LLC = Obj.getLinkeditDataLoadCommand(LCI);
|
||||
outs() << " ('dataoff', " << LLC.DataOffset << ")\n"
|
||||
<< " ('datasize', " << LLC.DataSize << ")\n"
|
||||
<< " ('_data_regions', [\n";
|
||||
|
||||
unsigned NumRegions = LLC.datasize / sizeof(MachO::data_in_code_entry);
|
||||
unsigned NumRegions = LLC.DataSize / sizeof(macho::DataInCodeTableEntry);
|
||||
for (unsigned i = 0; i < NumRegions; ++i) {
|
||||
MachO::data_in_code_entry DICE= Obj.getDataInCodeTableEntry(LLC.dataoff, i);
|
||||
macho::DataInCodeTableEntry DICE =
|
||||
Obj.getDataInCodeTableEntry(LLC.DataOffset, i);
|
||||
outs() << " # DICE " << i << "\n"
|
||||
<< " ('offset', " << DICE.offset << ")\n"
|
||||
<< " ('length', " << DICE.length << ")\n"
|
||||
<< " ('kind', " << DICE.kind << ")\n";
|
||||
<< " ('offset', " << DICE.Offset << ")\n"
|
||||
<< " ('length', " << DICE.Length << ")\n"
|
||||
<< " ('kind', " << DICE.Kind << ")\n";
|
||||
}
|
||||
|
||||
outs() <<" ])\n";
|
||||
@ -301,46 +310,46 @@ DumpDataInCodeDataCommand(const MachOObjectFile &Obj,
|
||||
static int
|
||||
DumpLinkerOptionsCommand(const MachOObjectFile &Obj,
|
||||
const MachOObjectFile::LoadCommandInfo &LCI) {
|
||||
MachO::linker_options_command LOLC = Obj.getLinkerOptionsLoadCommand(LCI);
|
||||
outs() << " ('count', " << LOLC.count << ")\n"
|
||||
<< " ('_strings', [\n";
|
||||
macho::LinkerOptionsLoadCommand LOLC = Obj.getLinkerOptionsLoadCommand(LCI);
|
||||
outs() << " ('count', " << LOLC.Count << ")\n"
|
||||
<< " ('_strings', [\n";
|
||||
|
||||
uint64_t DataSize = LOLC.cmdsize - sizeof(MachO::linker_options_command);
|
||||
const char *P = LCI.Ptr + sizeof(MachO::linker_options_command);
|
||||
StringRef Data(P, DataSize);
|
||||
for (unsigned i = 0; i != LOLC.count; ++i) {
|
||||
std::pair<StringRef,StringRef> Split = Data.split('\0');
|
||||
outs() << "\t\"";
|
||||
outs().write_escaped(Split.first);
|
||||
outs() << "\",\n";
|
||||
Data = Split.second;
|
||||
}
|
||||
outs() <<" ])\n";
|
||||
uint64_t DataSize = LOLC.Size - sizeof(macho::LinkerOptionsLoadCommand);
|
||||
const char *P = LCI.Ptr + sizeof(macho::LinkerOptionsLoadCommand);
|
||||
StringRef Data(P, DataSize);
|
||||
for (unsigned i = 0; i != LOLC.Count; ++i) {
|
||||
std::pair<StringRef,StringRef> Split = Data.split('\0');
|
||||
outs() << "\t\"";
|
||||
outs().write_escaped(Split.first);
|
||||
outs() << "\",\n";
|
||||
Data = Split.second;
|
||||
}
|
||||
outs() <<" ])\n";
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int DumpLoadCommand(const MachOObjectFile &Obj,
|
||||
MachOObjectFile::LoadCommandInfo &LCI) {
|
||||
switch (LCI.C.cmd) {
|
||||
case MachO::LC_SEGMENT:
|
||||
switch (LCI.C.Type) {
|
||||
case macho::LCT_Segment:
|
||||
return DumpSegmentCommand(Obj, LCI);
|
||||
case MachO::LC_SEGMENT_64:
|
||||
case macho::LCT_Segment64:
|
||||
return DumpSegment64Command(Obj, LCI);
|
||||
case MachO::LC_SYMTAB:
|
||||
case macho::LCT_Symtab:
|
||||
return DumpSymtabCommand(Obj);
|
||||
case MachO::LC_DYSYMTAB:
|
||||
case macho::LCT_Dysymtab:
|
||||
return DumpDysymtabCommand(Obj);
|
||||
case MachO::LC_CODE_SIGNATURE:
|
||||
case MachO::LC_SEGMENT_SPLIT_INFO:
|
||||
case MachO::LC_FUNCTION_STARTS:
|
||||
case macho::LCT_CodeSignature:
|
||||
case macho::LCT_SegmentSplitInfo:
|
||||
case macho::LCT_FunctionStarts:
|
||||
return DumpLinkeditDataCommand(Obj, LCI);
|
||||
case MachO::LC_DATA_IN_CODE:
|
||||
case macho::LCT_DataInCode:
|
||||
return DumpDataInCodeDataCommand(Obj, LCI);
|
||||
case MachO::LC_LINKER_OPTIONS:
|
||||
case macho::LCT_LinkerOptions:
|
||||
return DumpLinkerOptionsCommand(Obj, LCI);
|
||||
default:
|
||||
Warning("unknown load command: " + Twine(LCI.C.cmd));
|
||||
Warning("unknown load command: " + Twine(LCI.C.Type));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -349,27 +358,26 @@ static int DumpLoadCommand(const MachOObjectFile &Obj,
|
||||
static int DumpLoadCommand(const MachOObjectFile &Obj, unsigned Index,
|
||||
MachOObjectFile::LoadCommandInfo &LCI) {
|
||||
outs() << " # Load Command " << Index << "\n"
|
||||
<< " (('command', " << LCI.C.cmd << ")\n"
|
||||
<< " ('size', " << LCI.C.cmdsize << ")\n";
|
||||
<< " (('command', " << LCI.C.Type << ")\n"
|
||||
<< " ('size', " << LCI.C.Size << ")\n";
|
||||
int Res = DumpLoadCommand(Obj, LCI);
|
||||
outs() << " ),\n";
|
||||
return Res;
|
||||
}
|
||||
|
||||
static void printHeader(const MachOObjectFile *Obj,
|
||||
const MachO::mach_header &Header) {
|
||||
outs() << "('cputype', " << Header.cputype << ")\n";
|
||||
outs() << "('cpusubtype', " << Header.cpusubtype << ")\n";
|
||||
outs() << "('filetype', " << Header.filetype << ")\n";
|
||||
outs() << "('num_load_commands', " << Header.ncmds << ")\n";
|
||||
outs() << "('load_commands_size', " << Header.sizeofcmds << ")\n";
|
||||
outs() << "('flag', " << Header.flags << ")\n";
|
||||
const macho::Header &Header) {
|
||||
outs() << "('cputype', " << Header.CPUType << ")\n";
|
||||
outs() << "('cpusubtype', " << Header.CPUSubtype << ")\n";
|
||||
outs() << "('filetype', " << Header.FileType << ")\n";
|
||||
outs() << "('num_load_commands', " << Header.NumLoadCommands << ")\n";
|
||||
outs() << "('load_commands_size', " << Header.SizeOfLoadCommands << ")\n";
|
||||
outs() << "('flag', " << Header.Flags << ")\n";
|
||||
|
||||
// Print extended header if 64-bit.
|
||||
if (Obj->is64Bit()) {
|
||||
const MachO::mach_header_64 *Header64 =
|
||||
reinterpret_cast<const MachO::mach_header_64 *>(&Header);
|
||||
outs() << "('reserved', " << Header64->reserved << ")\n";
|
||||
macho::Header64Ext Header64Ext = Obj->getHeader64Ext();
|
||||
outs() << "('reserved', " << Header64Ext.Reserved << ")\n";
|
||||
}
|
||||
}
|
||||
|
||||
@ -388,13 +396,8 @@ int main(int argc, char **argv) {
|
||||
return Error("Not a MachO object");
|
||||
|
||||
// Print the header
|
||||
MachO::mach_header_64 Header64;
|
||||
MachO::mach_header *Header = reinterpret_cast<MachO::mach_header*>(&Header64);
|
||||
if (InputObject->is64Bit())
|
||||
Header64 = InputObject->getHeader64();
|
||||
else
|
||||
*Header = InputObject->getHeader();
|
||||
printHeader(InputObject, *Header);
|
||||
macho::Header Header = InputObject->getHeader();
|
||||
printHeader(InputObject, Header);
|
||||
|
||||
// Print the load commands.
|
||||
int Res = 0;
|
||||
@ -405,7 +408,7 @@ int main(int argc, char **argv) {
|
||||
if (DumpLoadCommand(*InputObject, i, Command))
|
||||
break;
|
||||
|
||||
if (i == Header->ncmds - 1)
|
||||
if (i == Header.NumLoadCommands - 1)
|
||||
break;
|
||||
Command = InputObject->getNextLoadCommandInfo(Command);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user