aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/CodeGen
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
commit6e561c71f74571ff2a448e7e07cb74047edef776 (patch)
tree3e318ff095e897ab39c5b141b60d54882562e5ef /include/llvm/CodeGen
parent35f1a9d21de3950385c014522d474a2ad7c6504c (diff)
downloadexternal_llvm-6e561c71f74571ff2a448e7e07cb74047edef776.zip
external_llvm-6e561c71f74571ff2a448e7e07cb74047edef776.tar.gz
external_llvm-6e561c71f74571ff2a448e7e07cb74047edef776.tar.bz2
Fix MachineCodeEmitter to use uintptr_t instead of intptr_t. This avoids some overflow issues. Patch by Thomas Jablin.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60828 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/CodeGen')
-rw-r--r--include/llvm/CodeGen/MachineCodeEmitter.h53
-rw-r--r--include/llvm/CodeGen/MachineRelocation.h14
2 files changed, 36 insertions, 31 deletions
diff --git a/include/llvm/CodeGen/MachineCodeEmitter.h b/include/llvm/CodeGen/MachineCodeEmitter.h
index d83591b..1161704 100644
--- a/include/llvm/CodeGen/MachineCodeEmitter.h
+++ b/include/llvm/CodeGen/MachineCodeEmitter.h
@@ -98,7 +98,7 @@ public:
/// written to the output stream in little-endian format.
///
void emitWordLE(unsigned W) {
- if (CurBufferPtr+4 <= BufferEnd) {
+ if (4 <= BufferEnd-CurBufferPtr) {
*CurBufferPtr++ = (unsigned char)(W >> 0);
*CurBufferPtr++ = (unsigned char)(W >> 8);
*CurBufferPtr++ = (unsigned char)(W >> 16);
@@ -112,7 +112,7 @@ public:
/// written to the output stream in big-endian format.
///
void emitWordBE(unsigned W) {
- if (CurBufferPtr+4 <= BufferEnd) {
+ if (4 <= BufferEnd-CurBufferPtr) {
*CurBufferPtr++ = (unsigned char)(W >> 24);
*CurBufferPtr++ = (unsigned char)(W >> 16);
*CurBufferPtr++ = (unsigned char)(W >> 8);
@@ -126,7 +126,7 @@ public:
/// written to the output stream in little-endian format.
///
void emitDWordLE(uint64_t W) {
- if (CurBufferPtr+8 <= BufferEnd) {
+ if (8 <= BufferEnd-CurBufferPtr) {
*CurBufferPtr++ = (unsigned char)(W >> 0);
*CurBufferPtr++ = (unsigned char)(W >> 8);
*CurBufferPtr++ = (unsigned char)(W >> 16);
@@ -144,7 +144,7 @@ public:
/// written to the output stream in big-endian format.
///
void emitDWordBE(uint64_t W) {
- if (CurBufferPtr+8 <= BufferEnd) {
+ if (8 <= BufferEnd-CurBufferPtr) {
*CurBufferPtr++ = (unsigned char)(W >> 56);
*CurBufferPtr++ = (unsigned char)(W >> 48);
*CurBufferPtr++ = (unsigned char)(W >> 40);
@@ -162,12 +162,15 @@ public:
/// alignment (saturated to BufferEnd of course).
void emitAlignment(unsigned Alignment) {
if (Alignment == 0) Alignment = 1;
- // Move the current buffer ptr up to the specified alignment.
- CurBufferPtr =
- (unsigned char*)(((intptr_t)CurBufferPtr+Alignment-1) &
- ~(intptr_t)(Alignment-1));
- if (CurBufferPtr > BufferEnd)
+
+ if(Alignment <= (uintptr_t)(BufferEnd-CurBufferPtr)) {
+ // Move the current buffer ptr up to the specified alignment.
+ CurBufferPtr =
+ (unsigned char*)(((uintptr_t)CurBufferPtr+Alignment-1) &
+ ~(uintptr_t)(Alignment-1));
+ } else {
CurBufferPtr = BufferEnd;
+ }
}
@@ -210,7 +213,7 @@ public:
/// emitInt32 - Emit a int32 directive.
void emitInt32(int Value) {
- if (CurBufferPtr+4 <= BufferEnd) {
+ if (4 <= BufferEnd-CurBufferPtr) {
*((uint32_t*)CurBufferPtr) = Value;
CurBufferPtr += 4;
} else {
@@ -220,7 +223,7 @@ public:
/// emitInt64 - Emit a int64 directive.
void emitInt64(uint64_t Value) {
- if (CurBufferPtr+8 <= BufferEnd) {
+ if (8 <= BufferEnd-CurBufferPtr) {
*((uint64_t*)CurBufferPtr) = Value;
CurBufferPtr += 8;
} else {
@@ -247,18 +250,20 @@ public:
/// allocateSpace - Allocate a block of space in the current output buffer,
/// returning null (and setting conditions to indicate buffer overflow) on
/// failure. Alignment is the alignment in bytes of the buffer desired.
- virtual void *allocateSpace(intptr_t Size, unsigned Alignment) {
+ virtual void *allocateSpace(uintptr_t Size, unsigned Alignment) {
emitAlignment(Alignment);
- void *Result = CurBufferPtr;
-
- // Allocate the space.
- CurBufferPtr += Size;
+ void *Result;
// Check for buffer overflow.
- if (CurBufferPtr >= BufferEnd) {
+ if (Size >= (uintptr_t)(BufferEnd-CurBufferPtr)) {
CurBufferPtr = BufferEnd;
Result = 0;
+ } else {
+ // Allocate the space.
+ Result = CurBufferPtr;
+ CurBufferPtr += Size;
}
+
return Result;
}
@@ -270,13 +275,13 @@ public:
/// getCurrentPCValue - This returns the address that the next emitted byte
/// will be output to.
///
- virtual intptr_t getCurrentPCValue() const {
- return (intptr_t)CurBufferPtr;
+ virtual uintptr_t getCurrentPCValue() const {
+ return (uintptr_t)CurBufferPtr;
}
/// getCurrentPCOffset - Return the offset from the start of the emitted
/// buffer that we are currently writing to.
- intptr_t getCurrentPCOffset() const {
+ uintptr_t getCurrentPCOffset() const {
return CurBufferPtr-BufferBegin;
}
@@ -290,23 +295,23 @@ public:
/// getConstantPoolEntryAddress - Return the address of the 'Index' entry in
/// the constant pool that was last emitted with the emitConstantPool method.
///
- virtual intptr_t getConstantPoolEntryAddress(unsigned Index) const = 0;
+ virtual uintptr_t getConstantPoolEntryAddress(unsigned Index) const = 0;
/// getJumpTableEntryAddress - Return the address of the jump table with index
/// 'Index' in the function that last called initJumpTableInfo.
///
- virtual intptr_t getJumpTableEntryAddress(unsigned Index) const = 0;
+ virtual uintptr_t getJumpTableEntryAddress(unsigned Index) const = 0;
/// getMachineBasicBlockAddress - Return the address of the specified
/// MachineBasicBlock, only usable after the label for the MBB has been
/// emitted.
///
- virtual intptr_t getMachineBasicBlockAddress(MachineBasicBlock *MBB) const= 0;
+ virtual uintptr_t getMachineBasicBlockAddress(MachineBasicBlock *MBB) const= 0;
/// getLabelAddress - Return the address of the specified LabelID, only usable
/// after the LabelID has been emitted.
///
- virtual intptr_t getLabelAddress(uint64_t LabelID) const = 0;
+ virtual uintptr_t getLabelAddress(uint64_t LabelID) const = 0;
/// Specifies the MachineModuleInfo object. This is used for exception handling
/// purposes.
diff --git a/include/llvm/CodeGen/MachineRelocation.h b/include/llvm/CodeGen/MachineRelocation.h
index 2181e20..c539781 100644
--- a/include/llvm/CodeGen/MachineRelocation.h
+++ b/include/llvm/CodeGen/MachineRelocation.h
@@ -49,7 +49,7 @@ class MachineRelocation {
/// Offset - This is the offset from the start of the code buffer of the
/// relocation to perform.
- intptr_t Offset;
+ uintptr_t Offset;
/// ConstantVal - A field that may be used by the target relocation type.
intptr_t ConstantVal;
@@ -79,7 +79,7 @@ public:
/// MachineRelocation::getGV - Return a relocation entry for a GlobalValue.
///
- static MachineRelocation getGV(intptr_t offset, unsigned RelocationType,
+ static MachineRelocation getGV(uintptr_t offset, unsigned RelocationType,
GlobalValue *GV, intptr_t cst = 0,
bool NeedStub = 0,
bool GOTrelative = 0) {
@@ -98,7 +98,7 @@ public:
/// MachineRelocation::getIndirectSymbol - Return a relocation entry for an
/// indirect symbol.
- static MachineRelocation getIndirectSymbol(intptr_t offset,
+ static MachineRelocation getIndirectSymbol(uintptr_t offset,
unsigned RelocationType,
GlobalValue *GV, intptr_t cst = 0,
bool NeedStub = 0,
@@ -118,7 +118,7 @@ public:
/// MachineRelocation::getBB - Return a relocation entry for a BB.
///
- static MachineRelocation getBB(intptr_t offset,unsigned RelocationType,
+ static MachineRelocation getBB(uintptr_t offset,unsigned RelocationType,
MachineBasicBlock *MBB, intptr_t cst = 0) {
assert((RelocationType & ~63) == 0 && "Relocation type too large!");
MachineRelocation Result;
@@ -136,7 +136,7 @@ public:
/// MachineRelocation::getExtSym - Return a relocation entry for an external
/// symbol, like "free".
///
- static MachineRelocation getExtSym(intptr_t offset, unsigned RelocationType,
+ static MachineRelocation getExtSym(uintptr_t offset, unsigned RelocationType,
const char *ES, intptr_t cst = 0,
bool GOTrelative = 0) {
assert((RelocationType & ~63) == 0 && "Relocation type too large!");
@@ -155,7 +155,7 @@ public:
/// MachineRelocation::getConstPool - Return a relocation entry for a constant
/// pool entry.
///
- static MachineRelocation getConstPool(intptr_t offset,unsigned RelocationType,
+ static MachineRelocation getConstPool(uintptr_t offset,unsigned RelocationType,
unsigned CPI, intptr_t cst = 0,
bool letTargetResolve = false) {
assert((RelocationType & ~63) == 0 && "Relocation type too large!");
@@ -174,7 +174,7 @@ public:
/// MachineRelocation::getJumpTable - Return a relocation entry for a jump
/// table entry.
///
- static MachineRelocation getJumpTable(intptr_t offset,unsigned RelocationType,
+ static MachineRelocation getJumpTable(uintptr_t offset,unsigned RelocationType,
unsigned JTI, intptr_t cst = 0,
bool letTargetResolve = false) {
assert((RelocationType & ~63) == 0 && "Relocation type too large!");