diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-12-10 02:32:19 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-12-10 02:32:19 +0000 |
commit | 6e561c71f74571ff2a448e7e07cb74047edef776 (patch) | |
tree | 3e318ff095e897ab39c5b141b60d54882562e5ef /include/llvm/CodeGen | |
parent | 35f1a9d21de3950385c014522d474a2ad7c6504c (diff) | |
download | external_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.h | 53 | ||||
-rw-r--r-- | include/llvm/CodeGen/MachineRelocation.h | 14 |
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!"); |