mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-10 16:24:04 +00:00
Cleanup MachO writer and code emitter. Fix 80 cols problems, remove extra spaces, shrink down includes and move some methods out-of-line
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74817 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8ae058a815
commit
752e928e6b
@ -14,17 +14,14 @@
|
|||||||
#ifndef MACHO_H
|
#ifndef MACHO_H
|
||||||
#define MACHO_H
|
#define MACHO_H
|
||||||
|
|
||||||
#include "llvm/Constants.h"
|
|
||||||
#include "llvm/DerivedTypes.h"
|
|
||||||
#include "llvm/CodeGen/MachineRelocation.h"
|
|
||||||
#include "llvm/CodeGen/BinaryObject.h"
|
#include "llvm/CodeGen/BinaryObject.h"
|
||||||
#include "llvm/Target/TargetAsmInfo.h"
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
typedef std::vector<unsigned char> DataBuffer;
|
class GlobalValue;
|
||||||
|
class TargetAsmInfo;
|
||||||
|
|
||||||
/// MachOSym - This struct contains information about each symbol that is
|
/// MachOSym - This struct contains information about each symbol that is
|
||||||
/// added to logical symbol table for the module. This is eventually
|
/// added to logical symbol table for the module. This is eventually
|
||||||
@ -111,7 +108,7 @@ struct MachOHeader {
|
|||||||
|
|
||||||
/// HeaderData - The actual data for the header which we are building
|
/// HeaderData - The actual data for the header which we are building
|
||||||
/// up for emission to the file.
|
/// up for emission to the file.
|
||||||
DataBuffer HeaderData;
|
std::vector<unsigned char> HeaderData;
|
||||||
|
|
||||||
// Constants for the filetype field
|
// Constants for the filetype field
|
||||||
// see <mach-o/loader.h> for additional info on the various types
|
// see <mach-o/loader.h> for additional info on the various types
|
||||||
@ -292,7 +289,7 @@ struct MachOSection : public BinaryObject {
|
|||||||
|
|
||||||
/// RelocBuffer - A buffer to hold the mach-o relocations before we write
|
/// RelocBuffer - A buffer to hold the mach-o relocations before we write
|
||||||
/// them out at the appropriate location in the file.
|
/// them out at the appropriate location in the file.
|
||||||
DataBuffer RelocBuffer;
|
std::vector<unsigned char> RelocBuffer;
|
||||||
|
|
||||||
// Constants for the section types (low 8 bits of flags field)
|
// Constants for the section types (low 8 bits of flags field)
|
||||||
// see <mach-o/loader.h>
|
// see <mach-o/loader.h>
|
||||||
|
@ -7,13 +7,18 @@
|
|||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "MachO.h"
|
||||||
|
#include "MachOWriter.h"
|
||||||
#include "MachOCodeEmitter.h"
|
#include "MachOCodeEmitter.h"
|
||||||
#include "llvm/Constants.h"
|
#include "llvm/Constants.h"
|
||||||
#include "llvm/DerivedTypes.h"
|
#include "llvm/DerivedTypes.h"
|
||||||
#include "llvm/Function.h"
|
#include "llvm/Function.h"
|
||||||
#include "llvm/CodeGen/MachineConstantPool.h"
|
#include "llvm/CodeGen/MachineConstantPool.h"
|
||||||
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
||||||
|
#include "llvm/CodeGen/MachineRelocation.h"
|
||||||
#include "llvm/Target/TargetAsmInfo.h"
|
#include "llvm/Target/TargetAsmInfo.h"
|
||||||
|
#include "llvm/Target/TargetData.h"
|
||||||
|
#include "llvm/Target/TargetMachine.h"
|
||||||
#include "llvm/Support/Mangler.h"
|
#include "llvm/Support/Mangler.h"
|
||||||
#include "llvm/Support/OutputBuffer.h"
|
#include "llvm/Support/OutputBuffer.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -24,6 +29,13 @@
|
|||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
|
MachOCodeEmitter::MachOCodeEmitter(MachOWriter &mow, MachOSection &mos) :
|
||||||
|
ObjectCodeEmitter(&mos), MOW(mow), TM(MOW.TM) {
|
||||||
|
is64Bit = TM.getTargetData()->getPointerSizeInBits() == 64;
|
||||||
|
isLittleEndian = TM.getTargetData()->isLittleEndian();
|
||||||
|
TAI = TM.getTargetAsmInfo();
|
||||||
|
}
|
||||||
|
|
||||||
/// startFunction - This callback is invoked when a new machine function is
|
/// startFunction - This callback is invoked when a new machine function is
|
||||||
/// about to be emitted.
|
/// about to be emitted.
|
||||||
|
|
||||||
@ -141,7 +153,8 @@ void MachOCodeEmitter::emitConstantPool(MachineConstantPool *MCP) {
|
|||||||
for (unsigned j = 0; j < Size; ++j)
|
for (unsigned j = 0; j < Size; ++j)
|
||||||
SecDataOut.outbyte(0);
|
SecDataOut.outbyte(0);
|
||||||
|
|
||||||
MachOWriter::InitMem(CP[i].Val.ConstVal, CPLocations[i], TM.getTargetData(), Sec);
|
MachOWriter::InitMem(CP[i].Val.ConstVal, CPLocations[i],
|
||||||
|
TM.getTargetData(), Sec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,10 +10,13 @@
|
|||||||
#ifndef MACHOCODEEMITTER_H
|
#ifndef MACHOCODEEMITTER_H
|
||||||
#define MACHOCODEEMITTER_H
|
#define MACHOCODEEMITTER_H
|
||||||
|
|
||||||
#include "MachOWriter.h"
|
#include "llvm/CodeGen/ObjectCodeEmitter.h"
|
||||||
|
#include <map>
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
|
class MachOWriter;
|
||||||
|
|
||||||
/// MachOCodeEmitter - This class is used by the MachOWriter to emit the code
|
/// MachOCodeEmitter - This class is used by the MachOWriter to emit the code
|
||||||
/// for functions to the Mach-O file.
|
/// for functions to the Mach-O file.
|
||||||
|
|
||||||
@ -36,12 +39,7 @@ class MachOCodeEmitter : public ObjectCodeEmitter {
|
|||||||
std::map<uint64_t, uintptr_t> Labels;
|
std::map<uint64_t, uintptr_t> Labels;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MachOCodeEmitter(MachOWriter &mow, MachOSection &mos) :
|
MachOCodeEmitter(MachOWriter &mow, MachOSection &mos);
|
||||||
ObjectCodeEmitter(&mos), MOW(mow), TM(MOW.TM) {
|
|
||||||
is64Bit = TM.getTargetData()->getPointerSizeInBits() == 64;
|
|
||||||
isLittleEndian = TM.getTargetData()->isLittleEndian();
|
|
||||||
TAI = TM.getTargetAsmInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void startFunction(MachineFunction &MF);
|
virtual void startFunction(MachineFunction &MF);
|
||||||
virtual bool finishFunction(MachineFunction &MF);
|
virtual bool finishFunction(MachineFunction &MF);
|
||||||
|
@ -22,25 +22,20 @@
|
|||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "MachO.h"
|
||||||
#include "MachOWriter.h"
|
#include "MachOWriter.h"
|
||||||
#include "MachOCodeEmitter.h"
|
#include "MachOCodeEmitter.h"
|
||||||
#include "llvm/Constants.h"
|
#include "llvm/Constants.h"
|
||||||
#include "llvm/DerivedTypes.h"
|
#include "llvm/DerivedTypes.h"
|
||||||
#include "llvm/Module.h"
|
#include "llvm/Module.h"
|
||||||
#include "llvm/PassManager.h"
|
#include "llvm/PassManager.h"
|
||||||
#include "llvm/CodeGen/FileWriters.h"
|
|
||||||
#include "llvm/CodeGen/MachineCodeEmitter.h"
|
|
||||||
#include "llvm/CodeGen/MachineConstantPool.h"
|
|
||||||
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
|
||||||
#include "llvm/Target/TargetAsmInfo.h"
|
#include "llvm/Target/TargetAsmInfo.h"
|
||||||
#include "llvm/Target/TargetJITInfo.h"
|
#include "llvm/Target/TargetData.h"
|
||||||
|
#include "llvm/Target/TargetMachine.h"
|
||||||
|
#include "llvm/Target/TargetMachOWriterInfo.h"
|
||||||
#include "llvm/Support/Mangler.h"
|
#include "llvm/Support/Mangler.h"
|
||||||
#include "llvm/Support/MathExtras.h"
|
|
||||||
#include "llvm/Support/OutputBuffer.h"
|
#include "llvm/Support/OutputBuffer.h"
|
||||||
#include "llvm/Support/Streams.h"
|
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
#include <algorithm>
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
@ -61,15 +56,13 @@ ObjectCodeEmitter *AddMachOWriter(PassManagerBase &PM,
|
|||||||
char MachOWriter::ID = 0;
|
char MachOWriter::ID = 0;
|
||||||
|
|
||||||
MachOWriter::MachOWriter(raw_ostream &o, TargetMachine &tm)
|
MachOWriter::MachOWriter(raw_ostream &o, TargetMachine &tm)
|
||||||
: MachineFunctionPass(&ID), O(o), TM(tm)
|
: MachineFunctionPass(&ID), O(o), TM(tm) {
|
||||||
{
|
|
||||||
is64Bit = TM.getTargetData()->getPointerSizeInBits() == 64;
|
is64Bit = TM.getTargetData()->getPointerSizeInBits() == 64;
|
||||||
isLittleEndian = TM.getTargetData()->isLittleEndian();
|
isLittleEndian = TM.getTargetData()->isLittleEndian();
|
||||||
|
|
||||||
TAI = TM.getTargetAsmInfo();
|
TAI = TM.getTargetAsmInfo();
|
||||||
|
|
||||||
// Create the machine code emitter object for this target.
|
// Create the machine code emitter object for this target.
|
||||||
|
|
||||||
MachOCE = new MachOCodeEmitter(*this, *getTextSection(true));
|
MachOCE = new MachOCodeEmitter(*this, *getTextSection(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,6 +119,89 @@ bool MachOWriter::doFinalization(Module &M) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getConstSection - Get constant section for Constant 'C'
|
||||||
|
MachOSection *MachOWriter::getConstSection(Constant *C) {
|
||||||
|
const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
|
||||||
|
if (CVA && CVA->isCString())
|
||||||
|
return getSection("__TEXT", "__cstring",
|
||||||
|
MachOSection::S_CSTRING_LITERALS);
|
||||||
|
|
||||||
|
const Type *Ty = C->getType();
|
||||||
|
if (Ty->isPrimitiveType() || Ty->isInteger()) {
|
||||||
|
unsigned Size = TM.getTargetData()->getTypeAllocSize(Ty);
|
||||||
|
switch(Size) {
|
||||||
|
default: break; // Fall through to __TEXT,__const
|
||||||
|
case 4:
|
||||||
|
return getSection("__TEXT", "__literal4",
|
||||||
|
MachOSection::S_4BYTE_LITERALS);
|
||||||
|
case 8:
|
||||||
|
return getSection("__TEXT", "__literal8",
|
||||||
|
MachOSection::S_8BYTE_LITERALS);
|
||||||
|
case 16:
|
||||||
|
return getSection("__TEXT", "__literal16",
|
||||||
|
MachOSection::S_16BYTE_LITERALS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return getSection("__TEXT", "__const");
|
||||||
|
}
|
||||||
|
|
||||||
|
// getJumpTableSection - Select the Jump Table section
|
||||||
|
MachOSection *MachOWriter::getJumpTableSection() {
|
||||||
|
if (TM.getRelocationModel() == Reloc::PIC_)
|
||||||
|
return getTextSection(false);
|
||||||
|
else
|
||||||
|
return getSection("__TEXT", "__const");
|
||||||
|
}
|
||||||
|
|
||||||
|
// getSection - Return the section with the specified name, creating a new
|
||||||
|
// section if one does not already exist.
|
||||||
|
MachOSection *MachOWriter::getSection(const std::string &seg,
|
||||||
|
const std::string §,
|
||||||
|
unsigned Flags /* = 0 */ ) {
|
||||||
|
MachOSection *MOS = SectionLookup[seg+sect];
|
||||||
|
if (MOS) return MOS;
|
||||||
|
|
||||||
|
MOS = new MachOSection(seg, sect);
|
||||||
|
SectionList.push_back(MOS);
|
||||||
|
MOS->Index = SectionList.size();
|
||||||
|
MOS->flags = MachOSection::S_REGULAR | Flags;
|
||||||
|
SectionLookup[seg+sect] = MOS;
|
||||||
|
return MOS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// getTextSection - Return text section with different flags for code/data
|
||||||
|
MachOSection *MachOWriter::getTextSection(bool isCode /* = true */ ) {
|
||||||
|
if (isCode)
|
||||||
|
return getSection("__TEXT", "__text",
|
||||||
|
MachOSection::S_ATTR_PURE_INSTRUCTIONS |
|
||||||
|
MachOSection::S_ATTR_SOME_INSTRUCTIONS);
|
||||||
|
else
|
||||||
|
return getSection("__TEXT", "__text");
|
||||||
|
}
|
||||||
|
|
||||||
|
MachOSection *MachOWriter::getBSSSection() {
|
||||||
|
return getSection("__DATA", "__bss", MachOSection::S_ZEROFILL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetJTRelocation - Get a relocation a new BB relocation based
|
||||||
|
// on target information.
|
||||||
|
MachineRelocation MachOWriter::GetJTRelocation(unsigned Offset,
|
||||||
|
MachineBasicBlock *MBB) const {
|
||||||
|
return TM.getMachOWriterInfo()->GetJTRelocation(Offset, MBB);
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTargetRelocation - Returns the number of relocations.
|
||||||
|
unsigned MachOWriter::GetTargetRelocation(MachineRelocation &MR,
|
||||||
|
unsigned FromIdx, unsigned ToAddr,
|
||||||
|
unsigned ToIndex, OutputBuffer &RelocOut,
|
||||||
|
OutputBuffer &SecOut, bool Scattered,
|
||||||
|
bool Extern) {
|
||||||
|
return TM.getMachOWriterInfo()->GetTargetRelocation(MR, FromIdx, ToAddr,
|
||||||
|
ToIndex, RelocOut,
|
||||||
|
SecOut, Scattered,
|
||||||
|
Extern);
|
||||||
|
}
|
||||||
|
|
||||||
void MachOWriter::AddSymbolToSection(MachOSection *Sec, GlobalVariable *GV) {
|
void MachOWriter::AddSymbolToSection(MachOSection *Sec, GlobalVariable *GV) {
|
||||||
const Type *Ty = GV->getType()->getElementType();
|
const Type *Ty = GV->getType()->getElementType();
|
||||||
unsigned Size = TM.getTargetData()->getTypeAllocSize(Ty);
|
unsigned Size = TM.getTargetData()->getTypeAllocSize(Ty);
|
||||||
@ -178,7 +254,8 @@ void MachOWriter::EmitGlobal(GlobalVariable *GV) {
|
|||||||
// merged with other symbols.
|
// merged with other symbols.
|
||||||
if (NoInit || GV->hasLinkOnceLinkage() || GV->hasWeakLinkage() ||
|
if (NoInit || GV->hasLinkOnceLinkage() || GV->hasWeakLinkage() ||
|
||||||
GV->hasCommonLinkage()) {
|
GV->hasCommonLinkage()) {
|
||||||
MachOSym ExtOrCommonSym(GV, Mang->getValueName(GV), MachOSym::NO_SECT, TAI);
|
MachOSym ExtOrCommonSym(GV, Mang->getValueName(GV),
|
||||||
|
MachOSym::NO_SECT, TAI);
|
||||||
// For undefined (N_UNDF) external (N_EXT) types, n_value is the size in
|
// For undefined (N_UNDF) external (N_EXT) types, n_value is the size in
|
||||||
// bytes of the symbol.
|
// bytes of the symbol.
|
||||||
ExtOrCommonSym.n_value = Size;
|
ExtOrCommonSym.n_value = Size;
|
||||||
@ -225,7 +302,7 @@ void MachOWriter::EmitHeaderAndLoadCommands() {
|
|||||||
|
|
||||||
// Step #3: write the header to the file
|
// Step #3: write the header to the file
|
||||||
// Local alias to shortenify coming code.
|
// Local alias to shortenify coming code.
|
||||||
DataBuffer &FH = Header.HeaderData;
|
std::vector<unsigned char> &FH = Header.HeaderData;
|
||||||
OutputBuffer FHOut(FH, is64Bit, isLittleEndian);
|
OutputBuffer FHOut(FH, is64Bit, isLittleEndian);
|
||||||
|
|
||||||
FHOut.outword(Header.magic);
|
FHOut.outword(Header.magic);
|
||||||
@ -388,7 +465,8 @@ void MachOWriter::BufferSymbolAndStringTable() {
|
|||||||
|
|
||||||
// Parition the symbol table entries so that all local symbols come before
|
// Parition the symbol table entries so that all local symbols come before
|
||||||
// all symbols with external linkage. { 1 | 2 3 }
|
// all symbols with external linkage. { 1 | 2 3 }
|
||||||
std::partition(SymbolTable.begin(), SymbolTable.end(), MachOSym::PartitionByLocal);
|
std::partition(SymbolTable.begin(), SymbolTable.end(),
|
||||||
|
MachOSym::PartitionByLocal);
|
||||||
|
|
||||||
// Advance iterator to beginning of external symbols and partition so that
|
// Advance iterator to beginning of external symbols and partition so that
|
||||||
// all external symbols defined in this module come before all external
|
// all external symbols defined in this module come before all external
|
||||||
|
@ -14,29 +14,27 @@
|
|||||||
#ifndef MACHOWRITER_H
|
#ifndef MACHOWRITER_H
|
||||||
#define MACHOWRITER_H
|
#define MACHOWRITER_H
|
||||||
|
|
||||||
#include "MachO.h"
|
|
||||||
#include "llvm/Constants.h"
|
|
||||||
#include "llvm/DerivedTypes.h"
|
|
||||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||||
#include "llvm/CodeGen/ObjectCodeEmitter.h"
|
|
||||||
#include "llvm/Target/TargetData.h"
|
|
||||||
#include "llvm/Target/TargetMachine.h"
|
|
||||||
#include "llvm/Target/TargetMachOWriterInfo.h"
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
class Constant;
|
||||||
class GlobalVariable;
|
class GlobalVariable;
|
||||||
class Mangler;
|
class Mangler;
|
||||||
class MachineRelocation;
|
class MachineRelocation;
|
||||||
class ObjectCodeEmitter;
|
|
||||||
class MachOCodeEmitter;
|
class MachOCodeEmitter;
|
||||||
|
class MachODySymTab;
|
||||||
|
class MachOHeader;
|
||||||
|
class MachOSection;
|
||||||
|
class MachOSym;
|
||||||
class TargetData;
|
class TargetData;
|
||||||
class TargetMachine;
|
class TargetMachine;
|
||||||
|
class TargetAsmInfo;
|
||||||
|
class ObjectCodeEmitter;
|
||||||
class OutputBuffer;
|
class OutputBuffer;
|
||||||
class raw_ostream;
|
class raw_ostream;
|
||||||
|
|
||||||
|
|
||||||
/// MachOWriter - This class implements the common target-independent code for
|
/// MachOWriter - This class implements the common target-independent code for
|
||||||
/// writing Mach-O files. Targets should derive a class from this to
|
/// writing Mach-O files. Targets should derive a class from this to
|
||||||
/// parameterize the output format.
|
/// parameterize the output format.
|
||||||
@ -70,35 +68,29 @@ namespace llvm {
|
|||||||
///
|
///
|
||||||
Mangler *Mang;
|
Mangler *Mang;
|
||||||
|
|
||||||
/// MachOCE - The MachineCodeEmitter object that we are exposing to emit machine
|
/// MachOCE - The MachineCodeEmitter object that we are exposing to emit
|
||||||
/// code for functions to the .o file.
|
/// machine code for functions to the .o file.
|
||||||
|
|
||||||
MachOCodeEmitter *MachOCE;
|
MachOCodeEmitter *MachOCE;
|
||||||
|
|
||||||
/// is64Bit/isLittleEndian - This information is inferred from the target
|
/// is64Bit/isLittleEndian - This information is inferred from the target
|
||||||
/// machine directly, indicating what header values and flags to set.
|
/// machine directly, indicating what header values and flags to set.
|
||||||
|
|
||||||
bool is64Bit, isLittleEndian;
|
bool is64Bit, isLittleEndian;
|
||||||
|
|
||||||
// Target Asm Info
|
// Target Asm Info
|
||||||
|
|
||||||
const TargetAsmInfo *TAI;
|
const TargetAsmInfo *TAI;
|
||||||
|
|
||||||
/// Header - An instance of MachOHeader that we will update while we build
|
/// Header - An instance of MachOHeader that we will update while we build
|
||||||
/// the file, and then emit during finalization.
|
/// the file, and then emit during finalization.
|
||||||
|
|
||||||
MachOHeader Header;
|
MachOHeader Header;
|
||||||
|
|
||||||
/// doInitialization - Emit the file header and all of the global variables
|
/// doInitialization - Emit the file header and all of the global variables
|
||||||
/// for the module to the Mach-O file.
|
/// for the module to the Mach-O file.
|
||||||
|
|
||||||
bool doInitialization(Module &M);
|
bool doInitialization(Module &M);
|
||||||
|
|
||||||
bool runOnMachineFunction(MachineFunction &MF);
|
bool runOnMachineFunction(MachineFunction &MF);
|
||||||
|
|
||||||
/// doFinalization - Now that the module has been completely processed, emit
|
/// doFinalization - Now that the module has been completely processed, emit
|
||||||
/// the Mach-O file to 'O'.
|
/// the Mach-O file to 'O'.
|
||||||
|
|
||||||
bool doFinalization(Module &M);
|
bool doFinalization(Module &M);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -106,83 +98,35 @@ namespace llvm {
|
|||||||
/// SectionList - This is the list of sections that we have emitted to the
|
/// SectionList - This is the list of sections that we have emitted to the
|
||||||
/// file. Once the file has been completely built, the segment load command
|
/// file. Once the file has been completely built, the segment load command
|
||||||
/// SectionCommands are constructed from this info.
|
/// SectionCommands are constructed from this info.
|
||||||
|
|
||||||
std::vector<MachOSection*> SectionList;
|
std::vector<MachOSection*> SectionList;
|
||||||
|
|
||||||
/// SectionLookup - This is a mapping from section name to SectionList entry
|
/// SectionLookup - This is a mapping from section name to SectionList entry
|
||||||
|
|
||||||
std::map<std::string, MachOSection*> SectionLookup;
|
std::map<std::string, MachOSection*> SectionLookup;
|
||||||
|
|
||||||
/// GVSection - This is a mapping from a GlobalValue to a MachOSection,
|
/// GVSection - This is a mapping from a GlobalValue to a MachOSection,
|
||||||
/// to aid in emitting relocations.
|
/// to aid in emitting relocations.
|
||||||
|
|
||||||
std::map<GlobalValue*, MachOSection*> GVSection;
|
std::map<GlobalValue*, MachOSection*> GVSection;
|
||||||
|
|
||||||
/// GVOffset - This is a mapping from a GlobalValue to an offset from the
|
/// GVOffset - This is a mapping from a GlobalValue to an offset from the
|
||||||
/// start of the section in which the GV resides, to aid in emitting
|
/// start of the section in which the GV resides, to aid in emitting
|
||||||
/// relocations.
|
/// relocations.
|
||||||
|
|
||||||
std::map<GlobalValue*, intptr_t> GVOffset;
|
std::map<GlobalValue*, intptr_t> GVOffset;
|
||||||
|
|
||||||
/// getSection - Return the section with the specified name, creating a new
|
/// getSection - Return the section with the specified name, creating a new
|
||||||
/// section if one does not already exist.
|
/// section if one does not already exist.
|
||||||
|
|
||||||
MachOSection *getSection(const std::string &seg, const std::string §,
|
MachOSection *getSection(const std::string &seg, const std::string §,
|
||||||
unsigned Flags = 0) {
|
unsigned Flags = 0);
|
||||||
MachOSection *MOS = SectionLookup[seg+sect];
|
|
||||||
if (MOS) return MOS;
|
/// getTextSection - Return text section with different flags for code/data
|
||||||
|
MachOSection *getTextSection(bool isCode = true);
|
||||||
|
|
||||||
MOS = new MachOSection(seg, sect);
|
|
||||||
SectionList.push_back(MOS);
|
|
||||||
MOS->Index = SectionList.size();
|
|
||||||
MOS->flags = MachOSection::S_REGULAR | Flags;
|
|
||||||
SectionLookup[seg+sect] = MOS;
|
|
||||||
return MOS;
|
|
||||||
}
|
|
||||||
MachOSection *getTextSection(bool isCode = true) {
|
|
||||||
if (isCode)
|
|
||||||
return getSection("__TEXT", "__text",
|
|
||||||
MachOSection::S_ATTR_PURE_INSTRUCTIONS |
|
|
||||||
MachOSection::S_ATTR_SOME_INSTRUCTIONS);
|
|
||||||
else
|
|
||||||
return getSection("__TEXT", "__text");
|
|
||||||
}
|
|
||||||
MachOSection *getBSSSection() {
|
|
||||||
return getSection("__DATA", "__bss", MachOSection::S_ZEROFILL);
|
|
||||||
}
|
|
||||||
MachOSection *getDataSection() {
|
MachOSection *getDataSection() {
|
||||||
return getSection("__DATA", "__data");
|
return getSection("__DATA", "__data");
|
||||||
}
|
}
|
||||||
MachOSection *getConstSection(Constant *C) {
|
|
||||||
const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
|
|
||||||
if (CVA && CVA->isCString())
|
|
||||||
return getSection("__TEXT", "__cstring",
|
|
||||||
MachOSection::S_CSTRING_LITERALS);
|
|
||||||
|
|
||||||
const Type *Ty = C->getType();
|
MachOSection *getBSSSection();
|
||||||
if (Ty->isPrimitiveType() || Ty->isInteger()) {
|
MachOSection *getConstSection(Constant *C);
|
||||||
unsigned Size = TM.getTargetData()->getTypeAllocSize(Ty);
|
MachOSection *getJumpTableSection();
|
||||||
switch(Size) {
|
|
||||||
default: break; // Fall through to __TEXT,__const
|
|
||||||
case 4:
|
|
||||||
return getSection("__TEXT", "__literal4",
|
|
||||||
MachOSection::S_4BYTE_LITERALS);
|
|
||||||
case 8:
|
|
||||||
return getSection("__TEXT", "__literal8",
|
|
||||||
MachOSection::S_8BYTE_LITERALS);
|
|
||||||
case 16:
|
|
||||||
return getSection("__TEXT", "__literal16",
|
|
||||||
MachOSection::S_16BYTE_LITERALS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return getSection("__TEXT", "__const");
|
|
||||||
}
|
|
||||||
MachOSection *getJumpTableSection() {
|
|
||||||
if (TM.getRelocationModel() == Reloc::PIC_)
|
|
||||||
return getTextSection(false);
|
|
||||||
else
|
|
||||||
return getSection("__TEXT", "__const");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// MachOSymTab - This struct contains information about the offsets and
|
/// MachOSymTab - This struct contains information about the offsets and
|
||||||
/// size of symbol table information.
|
/// size of symbol table information.
|
||||||
@ -218,11 +162,11 @@ namespace llvm {
|
|||||||
|
|
||||||
/// SymT - A buffer to hold the symbol table before we write it out at the
|
/// SymT - A buffer to hold the symbol table before we write it out at the
|
||||||
/// appropriate location in the file.
|
/// appropriate location in the file.
|
||||||
DataBuffer SymT;
|
std::vector<unsigned char> SymT;
|
||||||
|
|
||||||
/// StrT - A buffer to hold the string table before we write it out at the
|
/// StrT - A buffer to hold the string table before we write it out at the
|
||||||
/// appropriate location in the file.
|
/// appropriate location in the file.
|
||||||
DataBuffer StrT;
|
std::vector<unsigned char> StrT;
|
||||||
|
|
||||||
/// PendingSyms - This is a list of externally defined symbols that we have
|
/// PendingSyms - This is a list of externally defined symbols that we have
|
||||||
/// been asked to emit, but have not seen a reference to. When a reference
|
/// been asked to emit, but have not seen a reference to. When a reference
|
||||||
@ -233,10 +177,8 @@ namespace llvm {
|
|||||||
/// SymbolTable to aid in emitting the DYSYMTAB load command.
|
/// SymbolTable to aid in emitting the DYSYMTAB load command.
|
||||||
std::vector<unsigned> DynamicSymbolTable;
|
std::vector<unsigned> DynamicSymbolTable;
|
||||||
|
|
||||||
static void InitMem(const Constant *C,
|
static void InitMem(const Constant *C, uintptr_t Offset,
|
||||||
uintptr_t Offset,
|
const TargetData *TD, MachOSection* mos);
|
||||||
const TargetData *TD,
|
|
||||||
MachOSection* mos);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void AddSymbolToSection(MachOSection *MOS, GlobalVariable *GV);
|
void AddSymbolToSection(MachOSection *MOS, GlobalVariable *GV);
|
||||||
@ -247,25 +189,16 @@ namespace llvm {
|
|||||||
void BufferSymbolAndStringTable();
|
void BufferSymbolAndStringTable();
|
||||||
void CalculateRelocations(MachOSection &MOS);
|
void CalculateRelocations(MachOSection &MOS);
|
||||||
|
|
||||||
|
// GetJTRelocation - Get a relocation a new BB relocation based
|
||||||
|
// on target information.
|
||||||
MachineRelocation GetJTRelocation(unsigned Offset,
|
MachineRelocation GetJTRelocation(unsigned Offset,
|
||||||
MachineBasicBlock *MBB) const {
|
MachineBasicBlock *MBB) const;
|
||||||
return TM.getMachOWriterInfo()->GetJTRelocation(Offset, MBB);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// GetTargetRelocation - Returns the number of relocations.
|
/// GetTargetRelocation - Returns the number of relocations.
|
||||||
unsigned GetTargetRelocation(MachineRelocation &MR,
|
unsigned GetTargetRelocation(MachineRelocation &MR, unsigned FromIdx,
|
||||||
unsigned FromIdx,
|
unsigned ToAddr, unsigned ToIndex,
|
||||||
unsigned ToAddr,
|
OutputBuffer &RelocOut, OutputBuffer &SecOut,
|
||||||
unsigned ToIndex,
|
bool Scattered, bool Extern);
|
||||||
OutputBuffer &RelocOut,
|
|
||||||
OutputBuffer &SecOut,
|
|
||||||
bool Scattered,
|
|
||||||
bool Extern) {
|
|
||||||
return TM.getMachOWriterInfo()->GetTargetRelocation(MR, FromIdx, ToAddr,
|
|
||||||
ToIndex, RelocOut,
|
|
||||||
SecOut, Scattered,
|
|
||||||
Extern);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user