summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2008-12-10 02:32:19 +0000
committerEvan Cheng <evan.cheng@apple.com>2008-12-10 02:32:19 +0000
commit0b77319742c954e8a79bacf3f280242a06f59dbe (patch)
treed8b5f1d54539a1be6ac65188e026b9c819b54d3d /llvm/lib
parenta726c1763a44098710c6d4819abac3f148158ba8 (diff)
downloadbcm5719-llvm-0b77319742c954e8a79bacf3f280242a06f59dbe.tar.gz
bcm5719-llvm-0b77319742c954e8a79bacf3f280242a06f59dbe.zip
Fix MachineCodeEmitter to use uintptr_t instead of intptr_t. This avoids some overflow issues. Patch by Thomas Jablin.
llvm-svn: 60828
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/ELFWriter.cpp8
-rw-r--r--llvm/lib/CodeGen/MachOWriter.cpp14
-rw-r--r--llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp35
-rw-r--r--llvm/lib/Target/ARM/ARMCodeEmitter.cpp2
-rw-r--r--llvm/lib/Target/X86/X86CodeEmitter.cpp2
-rw-r--r--llvm/lib/Target/X86/X86JITInfo.cpp2
-rw-r--r--llvm/lib/Target/X86/X86JITInfo.h8
7 files changed, 39 insertions, 32 deletions
diff --git a/llvm/lib/CodeGen/ELFWriter.cpp b/llvm/lib/CodeGen/ELFWriter.cpp
index ea12d503a50..001bad98324 100644
--- a/llvm/lib/CodeGen/ELFWriter.cpp
+++ b/llvm/lib/CodeGen/ELFWriter.cpp
@@ -85,21 +85,21 @@ namespace llvm {
virtual void StartMachineBasicBlock(MachineBasicBlock *MBB) {
}
- virtual intptr_t getConstantPoolEntryAddress(unsigned Index) const {
+ virtual uintptr_t getConstantPoolEntryAddress(unsigned Index) const {
assert(0 && "CP not implementated yet!");
return 0;
}
- virtual intptr_t getJumpTableEntryAddress(unsigned Index) const {
+ virtual uintptr_t getJumpTableEntryAddress(unsigned Index) const {
assert(0 && "JT not implementated yet!");
return 0;
}
- virtual intptr_t getMachineBasicBlockAddress(MachineBasicBlock *MBB) const {
+ virtual uintptr_t getMachineBasicBlockAddress(MachineBasicBlock *MBB) const {
assert(0 && "JT not implementated yet!");
return 0;
}
- virtual intptr_t getLabelAddress(uint64_t Label) const {
+ virtual uintptr_t getLabelAddress(uint64_t Label) const {
assert(0 && "Label address not implementated yet!");
abort();
return 0;
diff --git a/llvm/lib/CodeGen/MachOWriter.cpp b/llvm/lib/CodeGen/MachOWriter.cpp
index 613f680bc79..a34204f4e81 100644
--- a/llvm/lib/CodeGen/MachOWriter.cpp
+++ b/llvm/lib/CodeGen/MachOWriter.cpp
@@ -75,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.
- std::vector<intptr_t> CPLocations;
+ std::vector<uintptr_t> CPLocations;
/// CPSections - This is a map of constant pool indices to the MachOSection
/// containing the constant pool entry for that index.
@@ -83,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.
- std::vector<intptr_t> JTLocations;
+ std::vector<uintptr_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.
- std::vector<intptr_t> MBBLocations;
+ std::vector<uintptr_t> MBBLocations;
public:
MachOCodeEmitter(MachOWriter &mow) : MOW(mow), TM(MOW.TM) {
@@ -106,11 +106,11 @@ namespace llvm {
void emitConstantPool(MachineConstantPool *MCP);
void emitJumpTables(MachineJumpTableInfo *MJTI);
- virtual intptr_t getConstantPoolEntryAddress(unsigned Index) const {
+ virtual uintptr_t getConstantPoolEntryAddress(unsigned Index) const {
assert(CPLocations.size() > Index && "CP not emitted!");
return CPLocations[Index];
}
- virtual intptr_t getJumpTableEntryAddress(unsigned Index) const {
+ virtual uintptr_t getJumpTableEntryAddress(unsigned Index) const {
assert(JTLocations.size() > Index && "JT not emitted!");
return JTLocations[Index];
}
@@ -121,13 +121,13 @@ namespace llvm {
MBBLocations[MBB->getNumber()] = getCurrentPCOffset();
}
- virtual intptr_t getMachineBasicBlockAddress(MachineBasicBlock *MBB) const {
+ virtual uintptr_t getMachineBasicBlockAddress(MachineBasicBlock *MBB) const {
assert(MBBLocations.size() > (unsigned)MBB->getNumber() &&
MBBLocations[MBB->getNumber()] && "MBB not emitted!");
return MBBLocations[MBB->getNumber()];
}
- virtual intptr_t getLabelAddress(uint64_t Label) const {
+ virtual uintptr_t getLabelAddress(uint64_t Label) const {
assert(0 && "get Label not implemented");
abort();
return 0;
diff --git a/llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp b/llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp
index a74f53d2ab9..e041767f8f3 100644
--- a/llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp
+++ b/llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp
@@ -467,7 +467,7 @@ namespace {
/// 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<uintptr_t> MBBLocations;
/// ConstantPool - The constant pool for the current function.
///
@@ -493,7 +493,7 @@ namespace {
/// LabelLocations - This vector is a mapping from Label ID's to their
/// address.
- std::vector<intptr_t> LabelLocations;
+ std::vector<uintptr_t> LabelLocations;
/// MMI - Machine module info for exception informations
MachineModuleInfo* MMI;
@@ -537,7 +537,7 @@ namespace {
/// allocateSpace - Reserves space in the current block if any, or
/// allocate a new one of the given size.
- virtual void *allocateSpace(intptr_t Size, unsigned Alignment);
+ virtual void *allocateSpace(uintptr_t Size, unsigned Alignment);
virtual void addRelocation(const MachineRelocation &MR) {
Relocations.push_back(MR);
@@ -551,10 +551,10 @@ namespace {
<< (void*) getCurrentPCValue() << "]\n";
}
- virtual intptr_t getConstantPoolEntryAddress(unsigned Entry) const;
- virtual intptr_t getJumpTableEntryAddress(unsigned Entry) const;
+ virtual uintptr_t getConstantPoolEntryAddress(unsigned Entry) const;
+ virtual uintptr_t getJumpTableEntryAddress(unsigned Entry) const;
- virtual intptr_t getMachineBasicBlockAddress(MachineBasicBlock *MBB) const {
+ virtual uintptr_t getMachineBasicBlockAddress(MachineBasicBlock *MBB) const {
assert(MBBLocations.size() > (unsigned)MBB->getNumber() &&
MBBLocations[MBB->getNumber()] && "MBB not emitted!");
return MBBLocations[MBB->getNumber()];
@@ -572,7 +572,7 @@ namespace {
LabelLocations[LabelID] = getCurrentPCValue();
}
- virtual intptr_t getLabelAddress(uint64_t LabelID) const {
+ virtual uintptr_t getLabelAddress(uint64_t LabelID) const {
assert(LabelLocations.size() > (unsigned)LabelID &&
LabelLocations[LabelID] && "Label not emitted!");
return LabelLocations[LabelID];
@@ -963,6 +963,13 @@ bool JITEmitter::finishFunction(MachineFunction &F) {
unsigned char *FnEnd = CurBufferPtr;
MemMgr->endFunctionBody(F.getFunction(), BufferBegin, FnEnd);
+
+ if (CurBufferPtr == BufferEnd) {
+ // FIXME: Allocate more space, then try again.
+ cerr << "JIT: Ran out of space for generated machine code!\n";
+ abort();
+ }
+
BufferBegin = CurBufferPtr = 0;
NumBytes += FnEnd-FnStart;
@@ -1044,7 +1051,7 @@ bool JITEmitter::finishFunction(MachineFunction &F) {
return false;
}
-void* JITEmitter::allocateSpace(intptr_t Size, unsigned Alignment) {
+void* JITEmitter::allocateSpace(uintptr_t Size, unsigned Alignment) {
if (BufferBegin)
return MachineCodeEmitter::allocateSpace(Size, Alignment);
@@ -1129,9 +1136,9 @@ void JITEmitter::emitJumpTableInfo(MachineJumpTableInfo *MJTI) {
const std::vector<MachineBasicBlock*> &MBBs = JT[i].MBBs;
// Store the offset of the basic block for this jump table slot in the
// memory we allocated for the jump table in 'initJumpTableInfo'
- intptr_t Base = (intptr_t)SlotPtr;
+ uintptr_t Base = (uintptr_t)SlotPtr;
for (unsigned mi = 0, me = MBBs.size(); mi != me; ++mi) {
- intptr_t MBBAddr = getMachineBasicBlockAddress(MBBs[mi]);
+ uintptr_t MBBAddr = getMachineBasicBlockAddress(MBBs[mi]);
*SlotPtr++ = TheJIT->getJITInfo().getPICJumpTableEntry(MBBAddr, Base);
}
}
@@ -1174,17 +1181,17 @@ void *JITEmitter::finishGVStub(const GlobalValue* GV) {
// in the constant pool that was last emitted with the 'emitConstantPool'
// method.
//
-intptr_t JITEmitter::getConstantPoolEntryAddress(unsigned ConstantNum) const {
+uintptr_t JITEmitter::getConstantPoolEntryAddress(unsigned ConstantNum) const {
assert(ConstantNum < ConstantPool->getConstants().size() &&
"Invalid ConstantPoolIndex!");
- return (intptr_t)ConstantPoolBase +
+ return (uintptr_t)ConstantPoolBase +
ConstantPool->getConstants()[ConstantNum].Offset;
}
// getJumpTableEntryAddress - Return the address of the JumpTable with index
// 'Index' in the jumpp table that was last initialized with 'initJumpTableInfo'
//
-intptr_t JITEmitter::getJumpTableEntryAddress(unsigned Index) const {
+uintptr_t JITEmitter::getJumpTableEntryAddress(unsigned Index) const {
const std::vector<MachineJumpTableEntry> &JT = JumpTable->getJumpTables();
assert(Index < JT.size() && "Invalid jump table index!");
@@ -1196,7 +1203,7 @@ intptr_t JITEmitter::getJumpTableEntryAddress(unsigned Index) const {
Offset *= EntrySize;
- return (intptr_t)((char *)JumpTableBase + Offset);
+ return (uintptr_t)((char *)JumpTableBase + Offset);
}
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/ARM/ARMCodeEmitter.cpp b/llvm/lib/Target/ARM/ARMCodeEmitter.cpp
index 56fc55315f7..c27fc5f1eaf 100644
--- a/llvm/lib/Target/ARM/ARMCodeEmitter.cpp
+++ b/llvm/lib/Target/ARM/ARMCodeEmitter.cpp
@@ -1078,7 +1078,7 @@ void ARMCodeEmitter::emitBranchInstruction(const MachineInstr &MI) {
void ARMCodeEmitter::emitInlineJumpTable(unsigned JTIndex) {
// Remember the base address of the inline jump table.
- intptr_t JTBase = MCE.getCurrentPCValue();
+ uintptr_t JTBase = MCE.getCurrentPCValue();
JTI->addJumpTableBaseAddr(JTIndex, JTBase);
DOUT << " ** Jump Table #" << JTIndex << " @ " << (void*)JTBase << '\n';
diff --git a/llvm/lib/Target/X86/X86CodeEmitter.cpp b/llvm/lib/Target/X86/X86CodeEmitter.cpp
index 033d3b61e33..dbcb52a4816 100644
--- a/llvm/lib/Target/X86/X86CodeEmitter.cpp
+++ b/llvm/lib/Target/X86/X86CodeEmitter.cpp
@@ -555,7 +555,7 @@ void Emitter::emitInstruction(const MachineInstr &MI,
MCE.emitByte(BaseOpcode);
emitConstant(0, X86InstrInfo::sizeOfImm(Desc));
// Remember PIC base.
- PICBaseOffset = MCE.getCurrentPCOffset();
+ PICBaseOffset = (intptr_t) MCE.getCurrentPCOffset();
X86JITInfo *JTI = TM.getJITInfo();
JTI->setPICBase(MCE.getCurrentPCValue());
break;
diff --git a/llvm/lib/Target/X86/X86JITInfo.cpp b/llvm/lib/Target/X86/X86JITInfo.cpp
index 951999640ab..b7b7667f046 100644
--- a/llvm/lib/Target/X86/X86JITInfo.cpp
+++ b/llvm/lib/Target/X86/X86JITInfo.cpp
@@ -476,7 +476,7 @@ void *X86JITInfo::emitFunctionStub(const Function* F, void *Fn,
/// getPICJumpTableEntry - Returns the value of the jumptable entry for the
/// specific basic block.
-intptr_t X86JITInfo::getPICJumpTableEntry(intptr_t BB, intptr_t Entry) {
+uintptr_t X86JITInfo::getPICJumpTableEntry(uintptr_t BB, uintptr_t Entry) {
#if defined(X86_64_JIT)
return BB - Entry;
#else
diff --git a/llvm/lib/Target/X86/X86JITInfo.h b/llvm/lib/Target/X86/X86JITInfo.h
index dd266364333..ed660b0b585 100644
--- a/llvm/lib/Target/X86/X86JITInfo.h
+++ b/llvm/lib/Target/X86/X86JITInfo.h
@@ -22,7 +22,7 @@ namespace llvm {
class X86JITInfo : public TargetJITInfo {
X86TargetMachine &TM;
- intptr_t PICBase;
+ uintptr_t PICBase;
char* TLSOffset;
public:
explicit X86JITInfo(X86TargetMachine &tm) : TM(tm) {
@@ -51,7 +51,7 @@ namespace llvm {
/// getPICJumpTableEntry - Returns the value of the jumptable entry for the
/// specific basic block.
- virtual intptr_t getPICJumpTableEntry(intptr_t BB, intptr_t JTBase);
+ virtual uintptr_t getPICJumpTableEntry(uintptr_t BB, uintptr_t JTBase);
/// getLazyResolverFunction - Expose the lazy resolver to the JIT.
virtual LazyResolverFn getLazyResolverFunction(JITCompilerFn);
@@ -69,8 +69,8 @@ namespace llvm {
/// setPICBase / getPICBase - Getter / setter of PICBase, used to compute
/// PIC jumptable entry.
- void setPICBase(intptr_t Base) { PICBase = Base; }
- intptr_t getPICBase() const { return PICBase; }
+ void setPICBase(uintptr_t Base) { PICBase = Base; }
+ uintptr_t getPICBase() const { return PICBase; }
};
}
OpenPOWER on IntegriCloud