projects
/
oota-llvm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Propagate debug loc info through prologue/epilogue.
[oota-llvm.git]
/
lib
/
CodeGen
/
MachOWriter.cpp
diff --git
a/lib/CodeGen/MachOWriter.cpp
b/lib/CodeGen/MachOWriter.cpp
index 36060e150eac1334dc3d5b4fe812d6fb5c726cdf..22c21578ec0cb45b7c858e051fad483e48accd09 100644
(file)
--- a/
lib/CodeGen/MachOWriter.cpp
+++ b/
lib/CodeGen/MachOWriter.cpp
@@
-2,8
+2,8
@@
//
// The LLVM Compiler Infrastructure
//
//
// The LLVM Compiler Infrastructure
//
-// This file
was developed by Nate Begeman and is distributed under th
e
-//
University of Illinois Open Source
License. See LICENSE.TXT for details.
+// This file
is distributed under the University of Illinois Open Sourc
e
+// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//
//===----------------------------------------------------------------------===//
//
@@
-37,16
+37,18
@@
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/OutputBuffer.h"
#include "llvm/Support/Streams.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/OutputBuffer.h"
#include "llvm/Support/Streams.h"
+#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <algorithm>
+#include <cstring>
using namespace llvm;
/// AddMachOWriter - Concrete function to add the Mach-O writer to the function
/// pass manager.
using namespace llvm;
/// AddMachOWriter - Concrete function to add the Mach-O writer to the function
/// pass manager.
-MachineCodeEmitter *llvm::AddMachOWriter(
FunctionPassManager &F
PM,
-
std::
ostream &O,
+MachineCodeEmitter *llvm::AddMachOWriter(
PassManagerBase &
PM,
+
raw_
ostream &O,
TargetMachine &TM) {
MachOWriter *MOW = new MachOWriter(O, TM);
TargetMachine &TM) {
MachOWriter *MOW = new MachOWriter(O, TM);
-
F
PM.add(MOW);
+ PM.add(MOW);
return &MOW->getMachineCodeEmitter();
}
return &MOW->getMachineCodeEmitter();
}
@@
-73,7
+75,7
@@
namespace llvm {
/// CPLocations - This is a map of constant pool indices to offsets from the
/// start of the section for that constant pool index.
/// CPLocations - This is a map of constant pool indices to offsets from the
/// start of the section for that constant pool index.
- std::vector<intptr_t> CPLocations;
+ std::vector<
u
intptr_t> CPLocations;
/// CPSections - This is a map of constant pool indices to the MachOSection
/// containing the constant pool entry for that index.
/// CPSections - This is a map of constant pool indices to the MachOSection
/// containing the constant pool entry for that index.
@@
-81,12
+83,12
@@
namespace llvm {
/// JTLocations - This is a map of jump table indices to offsets from the
/// start of the section for that jump table index.
/// JTLocations - This is a map of jump table indices to offsets from the
/// start of the section for that jump table index.
- std::vector<intptr_t> JTLocations;
+ std::vector<
u
intptr_t> JTLocations;
/// MBBLocations - This vector is a mapping from MBB ID's to their address.
/// It is filled in by the StartMachineBasicBlock callback and queried by
/// the getMachineBasicBlockAddress callback.
/// MBBLocations - This vector is a mapping from MBB ID's to their address.
/// It is filled in by the StartMachineBasicBlock callback and queried by
/// the getMachineBasicBlockAddress callback.
- std::vector<intptr_t> MBBLocations;
+ std::vector<
u
intptr_t> MBBLocations;
public:
MachOCodeEmitter(MachOWriter &mow) : MOW(mow), TM(MOW.TM) {
public:
MachOCodeEmitter(MachOWriter &mow) : MOW(mow), TM(MOW.TM) {
@@
-104,11
+106,11
@@
namespace llvm {
void emitConstantPool(MachineConstantPool *MCP);
void emitJumpTables(MachineJumpTableInfo *MJTI);
void emitConstantPool(MachineConstantPool *MCP);
void emitJumpTables(MachineJumpTableInfo *MJTI);
- virtual intptr_t getConstantPoolEntryAddress(unsigned Index) const {
+ virtual
u
intptr_t getConstantPoolEntryAddress(unsigned Index) const {
assert(CPLocations.size() > Index && "CP not emitted!");
return CPLocations[Index];
}
assert(CPLocations.size() > Index && "CP not emitted!");
return CPLocations[Index];
}
- virtual intptr_t getJumpTableEntryAddress(unsigned Index) const {
+ virtual
u
intptr_t getJumpTableEntryAddress(unsigned Index) const {
assert(JTLocations.size() > Index && "JT not emitted!");
return JTLocations[Index];
}
assert(JTLocations.size() > Index && "JT not emitted!");
return JTLocations[Index];
}
@@
-119,18
+121,38
@@
namespace llvm {
MBBLocations[MBB->getNumber()] = getCurrentPCOffset();
}
MBBLocations[MBB->getNumber()] = getCurrentPCOffset();
}
- virtual intptr_t getMachineBasicBlockAddress(MachineBasicBlock *MBB) const {
+ virtual
u
intptr_t getMachineBasicBlockAddress(MachineBasicBlock *MBB) const {
assert(MBBLocations.size() > (unsigned)MBB->getNumber() &&
MBBLocations[MBB->getNumber()] && "MBB not emitted!");
return MBBLocations[MBB->getNumber()];
}
assert(MBBLocations.size() > (unsigned)MBB->getNumber() &&
MBBLocations[MBB->getNumber()] && "MBB not emitted!");
return MBBLocations[MBB->getNumber()];
}
+ virtual uintptr_t getLabelAddress(uint64_t Label) const {
+ assert(0 && "get Label not implemented");
+ abort();
+ return 0;
+ }
+
+ virtual void emitLabel(uint64_t LabelID) {
+ assert(0 && "emit Label not implemented");
+ abort();
+ }
+
+
+ virtual void setModuleInfo(llvm::MachineModuleInfo* MMI) { }
+
/// JIT SPECIFIC FUNCTIONS - DO NOT IMPLEMENT THESE HERE!
/// JIT SPECIFIC FUNCTIONS - DO NOT IMPLEMENT THESE HERE!
- virtual void startFunctionStub(unsigned StubSize, unsigned Alignment = 1) {
+ virtual void startGVStub(const GlobalValue* F, unsigned StubSize,
+ unsigned Alignment = 1) {
+ assert(0 && "JIT specific function called!");
+ abort();
+ }
+ virtual void startGVStub(const GlobalValue* F, void *Buffer,
+ unsigned StubSize) {
assert(0 && "JIT specific function called!");
abort();
}
assert(0 && "JIT specific function called!");
abort();
}
- virtual void *finish
FunctionStub(const Function *
F) {
+ virtual void *finish
GVStub(const GlobalValue*
F) {
assert(0 && "JIT specific function called!");
abort();
return 0;
assert(0 && "JIT specific function called!");
abort();
return 0;
@@
-247,8
+269,8
@@
void MachOCodeEmitter::emitConstantPool(MachineConstantPool *MCP) {
if (CP.empty()) return;
// FIXME: handle PIC codegen
if (CP.empty()) return;
// FIXME: handle PIC codegen
- bool isPIC = TM.getRelocationModel() == Reloc::PIC_;
-
assert(!isPIC &&
"PIC codegen not yet handled for mach-o jump tables!");
+ assert(TM.getRelocationModel() != Reloc::PIC_ &&
+
"PIC codegen not yet handled for mach-o jump tables!");
// Although there is no strict necessity that I am aware of, we will do what
// gcc for OS X does and put each constant pool entry in a section of constant
// Although there is no strict necessity that I am aware of, we will do what
// gcc for OS X does and put each constant pool entry in a section of constant
@@
-259,7
+281,7
@@
void MachOCodeEmitter::emitConstantPool(MachineConstantPool *MCP) {
// "giant object for PIC" optimization.
for (unsigned i = 0, e = CP.size(); i != e; ++i) {
const Type *Ty = CP[i].getType();
// "giant object for PIC" optimization.
for (unsigned i = 0, e = CP.size(); i != e; ++i) {
const Type *Ty = CP[i].getType();
- unsigned Size = TM.getTargetData()->getTypeSize(Ty);
+ unsigned Size = TM.getTargetData()->getType
Padded
Size(Ty);
MachOWriter::MachOSection *Sec = MOW.getConstSection(CP[i].Val.ConstVal);
OutputBuffer SecDataOut(Sec->SectionData, is64Bit, isLittleEndian);
MachOWriter::MachOSection *Sec = MOW.getConstSection(CP[i].Val.ConstVal);
OutputBuffer SecDataOut(Sec->SectionData, is64Bit, isLittleEndian);
@@
-288,8
+310,8
@@
void MachOCodeEmitter::emitJumpTables(MachineJumpTableInfo *MJTI) {
if (JT.empty()) return;
// FIXME: handle PIC codegen
if (JT.empty()) return;
// FIXME: handle PIC codegen
- bool isPIC = TM.getRelocationModel() == Reloc::PIC_;
-
assert(!isPIC &&
"PIC codegen not yet handled for mach-o jump tables!");
+ assert(TM.getRelocationModel() != Reloc::PIC_ &&
+
"PIC codegen not yet handled for mach-o jump tables!");
MachOWriter::MachOSection *Sec = MOW.getJumpTableSection();
unsigned TextSecIndex = MOW.getTextSection()->Index;
MachOWriter::MachOSection *Sec = MOW.getJumpTableSection();
unsigned TextSecIndex = MOW.getTextSection()->Index;
@@
-318,8
+340,8
@@
void MachOCodeEmitter::emitJumpTables(MachineJumpTableInfo *MJTI) {
//===----------------------------------------------------------------------===//
char MachOWriter::ID = 0;
//===----------------------------------------------------------------------===//
char MachOWriter::ID = 0;
-MachOWriter::MachOWriter(
std::
ostream &o, TargetMachine &tm)
- : MachineFunctionPass(
(intptr_t)
&ID), O(o), TM(tm) {
+MachOWriter::MachOWriter(
raw_
ostream &o, TargetMachine &tm)
+ : MachineFunctionPass(&ID), O(o), TM(tm) {
is64Bit = TM.getTargetData()->getPointerSizeInBits() == 64;
isLittleEndian = TM.getTargetData()->isLittleEndian();
is64Bit = TM.getTargetData()->getPointerSizeInBits() == 64;
isLittleEndian = TM.getTargetData()->isLittleEndian();
@@
-333,11
+355,9
@@
MachOWriter::~MachOWriter() {
void MachOWriter::AddSymbolToSection(MachOSection *Sec, GlobalVariable *GV) {
const Type *Ty = GV->getType()->getElementType();
void MachOWriter::AddSymbolToSection(MachOSection *Sec, GlobalVariable *GV) {
const Type *Ty = GV->getType()->getElementType();
- unsigned Size = TM.getTargetData()->getTypeSize(Ty);
- unsigned Align = GV->getAlignment();
- if (Align == 0)
- Align = TM.getTargetData()->getPrefTypeAlignment(Ty);
-
+ unsigned Size = TM.getTargetData()->getTypePaddedSize(Ty);
+ unsigned Align = TM.getTargetData()->getPreferredAlignment(GV);
+
// Reserve space in the .bss section for this symbol while maintaining the
// desired section alignment, which must be at least as much as required by
// this symbol.
// Reserve space in the .bss section for this symbol while maintaining the
// desired section alignment, which must be at least as much as required by
// this symbol.
@@
-356,7
+376,7
@@
void MachOWriter::AddSymbolToSection(MachOSection *Sec, GlobalVariable *GV) {
SecDataOut.outbyte(0);
}
// Globals without external linkage apparently do not go in the symbol table.
SecDataOut.outbyte(0);
}
// Globals without external linkage apparently do not go in the symbol table.
- if (
GV->getLinkage() != GlobalValue::InternalLinkage
) {
+ if (
!GV->hasLocalLinkage()
) {
MachOSym Sym(GV, Mang->getValueName(GV), Sec->Index, TM);
Sym.n_value = Sec->size;
SymbolTable.push_back(Sym);
MachOSym Sym(GV, Mang->getValueName(GV), Sec->Index, TM);
Sym.n_value = Sec->size;
SymbolTable.push_back(Sym);
@@
-380,7
+400,7
@@
void MachOWriter::AddSymbolToSection(MachOSection *Sec, GlobalVariable *GV) {
void MachOWriter::EmitGlobal(GlobalVariable *GV) {
const Type *Ty = GV->getType()->getElementType();
void MachOWriter::EmitGlobal(GlobalVariable *GV) {
const Type *Ty = GV->getType()->getElementType();
- unsigned Size = TM.getTargetData()->getTypeSize(Ty);
+ unsigned Size = TM.getTargetData()->getType
Padded
Size(Ty);
bool NoInit = !GV->hasInitializer();
// If this global has a zero initializer, it is part of the .bss or common
bool NoInit = !GV->hasInitializer();
// If this global has a zero initializer, it is part of the .bss or common
@@
-389,7
+409,8
@@
void MachOWriter::EmitGlobal(GlobalVariable *GV) {
// If this global is part of the common block, add it now. Variables are
// part of the common block if they are zero initialized and allowed to be
// merged with other symbols.
// If this global is part of the common block, add it now. Variables are
// part of the common block if they are zero initialized and allowed to be
// merged with other symbols.
- if (NoInit || GV->hasLinkOnceLinkage() || GV->hasWeakLinkage()) {
+ if (NoInit || GV->hasLinkOnceLinkage() || GV->hasWeakLinkage() ||
+ GV->hasCommonLinkage()) {
MachOSym ExtOrCommonSym(GV, Mang->getValueName(GV), MachOSym::NO_SECT,TM);
// For undefined (N_UNDF) external (N_EXT) types, n_value is the size in
// bytes of the symbol.
MachOSym ExtOrCommonSym(GV, Mang->getValueName(GV), MachOSym::NO_SECT,TM);
// For undefined (N_UNDF) external (N_EXT) types, n_value is the size in
// bytes of the symbol.
@@
-803,7
+824,8
@@
void MachOWriter::InitMem(const Constant *C, void *Addr, intptr_t Offset,
if (isa<UndefValue>(PC)) {
continue;
} else if (const ConstantVector *CP = dyn_cast<ConstantVector>(PC)) {
if (isa<UndefValue>(PC)) {
continue;
} else if (const ConstantVector *CP = dyn_cast<ConstantVector>(PC)) {
- unsigned ElementSize = TD->getTypeSize(CP->getType()->getElementType());
+ unsigned ElementSize =
+ TD->getTypePaddedSize(CP->getType()->getElementType());
for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i)
WorkList.push_back(CPair(CP->getOperand(i), PA+i*ElementSize));
} else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(PC)) {
for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i)
WorkList.push_back(CPair(CP->getOperand(i), PA+i*ElementSize));
} else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(PC)) {
@@
-824,7
+846,7
@@
void MachOWriter::InitMem(const Constant *C, void *Addr, intptr_t Offset,
abort();
break;
}
abort();
break;
}
- } else if (PC->getType()->is
FirstClass
Type()) {
+ } else if (PC->getType()->is
SingleValue
Type()) {
unsigned char *ptr = (unsigned char *)PA;
switch (PC->getType()->getTypeID()) {
case Type::IntegerTyID: {
unsigned char *ptr = (unsigned char *)PA;
switch (PC->getType()->getTypeID()) {
case Type::IntegerTyID: {
@@
-861,7
+883,8
@@
void MachOWriter::InitMem(const Constant *C, void *Addr, intptr_t Offset,
break;
}
case Type::FloatTyID: {
break;
}
case Type::FloatTyID: {
- uint64_t val = FloatToBits(cast<ConstantFP>(PC)->getValue());
+ uint32_t val = cast<ConstantFP>(PC)->getValueAPF().bitcastToAPInt().
+ getZExtValue();
if (TD->isBigEndian())
val = ByteSwap_32(val);
ptr[0] = val;
if (TD->isBigEndian())
val = ByteSwap_32(val);
ptr[0] = val;
@@
-871,7
+894,8
@@
void MachOWriter::InitMem(const Constant *C, void *Addr, intptr_t Offset,
break;
}
case Type::DoubleTyID: {
break;
}
case Type::DoubleTyID: {
- uint64_t val = DoubleToBits(cast<ConstantFP>(PC)->getValue());
+ uint64_t val = cast<ConstantFP>(PC)->getValueAPF().bitcastToAPInt().
+ getZExtValue();
if (TD->isBigEndian())
val = ByteSwap_64(val);
ptr[0] = val;
if (TD->isBigEndian())
val = ByteSwap_64(val);
ptr[0] = val;
@@
-902,9
+926,10
@@
void MachOWriter::InitMem(const Constant *C, void *Addr, intptr_t Offset,
abort();
}
} else if (isa<ConstantAggregateZero>(PC)) {
abort();
}
} else if (isa<ConstantAggregateZero>(PC)) {
- memset((void*)PA, 0, (size_t)TD->getTypeSize(PC->getType()));
+ memset((void*)PA, 0, (size_t)TD->getType
Padded
Size(PC->getType()));
} else if (const ConstantArray *CPA = dyn_cast<ConstantArray>(PC)) {
} else if (const ConstantArray *CPA = dyn_cast<ConstantArray>(PC)) {
- unsigned ElementSize = TD->getTypeSize(CPA->getType()->getElementType());
+ unsigned ElementSize =
+ TD->getTypePaddedSize(CPA->getType()->getElementType());
for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i)
WorkList.push_back(CPair(CPA->getOperand(i), PA+i*ElementSize));
} else if (const ConstantStruct *CPS = dyn_cast<ConstantStruct>(PC)) {
for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i)
WorkList.push_back(CPair(CPA->getOperand(i), PA+i*ElementSize));
} else if (const ConstantStruct *CPS = dyn_cast<ConstantStruct>(PC)) {
@@
-933,11
+958,15
@@
MachOSym::MachOSym(const GlobalValue *gv, std::string name, uint8_t sect,
break;
case GlobalValue::WeakLinkage:
case GlobalValue::LinkOnceLinkage:
break;
case GlobalValue::WeakLinkage:
case GlobalValue::LinkOnceLinkage:
+ case GlobalValue::CommonLinkage:
assert(!isa<Function>(gv) && "Unexpected linkage type for Function!");
case GlobalValue::ExternalLinkage:
GVName = TAI->getGlobalPrefix() + name;
n_type |= GV->hasHiddenVisibility() ? N_PEXT : N_EXT;
break;
assert(!isa<Function>(gv) && "Unexpected linkage type for Function!");
case GlobalValue::ExternalLinkage:
GVName = TAI->getGlobalPrefix() + name;
n_type |= GV->hasHiddenVisibility() ? N_PEXT : N_EXT;
break;
+ case GlobalValue::PrivateLinkage:
+ GVName = TAI->getPrivateGlobalPrefix() + name;
+ break;
case GlobalValue::InternalLinkage:
GVName = TAI->getGlobalPrefix() + name;
break;
case GlobalValue::InternalLinkage:
GVName = TAI->getGlobalPrefix() + name;
break;