summaryrefslogtreecommitdiff
path: root/include/llvm/CodeGen/MachineCodeEmitter.h
diff options
context:
space:
mode:
authorJeffrey Yasskin <jyasskin@google.com>2009-12-15 22:42:46 +0000
committerJeffrey Yasskin <jyasskin@google.com>2009-12-15 22:42:46 +0000
commit32d7e6ebde29faeea75ecb718b4281414b0eea0b (patch)
treee028decfe52b4e0740391a657d01b1bef54c2492 /include/llvm/CodeGen/MachineCodeEmitter.h
parent6be413dd64c359f03b91321defceef9d641f1235 (diff)
downloadllvm-32d7e6ebde29faeea75ecb718b4281414b0eea0b.tar.gz
llvm-32d7e6ebde29faeea75ecb718b4281414b0eea0b.tar.bz2
llvm-32d7e6ebde29faeea75ecb718b4281414b0eea0b.tar.xz
Change indirect-globals to use a dedicated allocIndirectGV. This lets us
remove start/finishGVStub and the BufferState helper class from the MachineCodeEmitter interface. It has the side-effect of not setting the indirect global writable and then executable on ARM, but that shouldn't be necessary. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@91464 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/CodeGen/MachineCodeEmitter.h')
-rw-r--r--include/llvm/CodeGen/MachineCodeEmitter.h61
1 files changed, 22 insertions, 39 deletions
diff --git a/include/llvm/CodeGen/MachineCodeEmitter.h b/include/llvm/CodeGen/MachineCodeEmitter.h
index 791db003ea..d598a9387a 100644
--- a/include/llvm/CodeGen/MachineCodeEmitter.h
+++ b/include/llvm/CodeGen/MachineCodeEmitter.h
@@ -48,41 +48,16 @@ class Function;
/// occurred, more memory is allocated, and we reemit the code into it.
///
class MachineCodeEmitter {
-public:
- class BufferState {
- friend class MachineCodeEmitter;
- /// BufferBegin/BufferEnd - Pointers to the start and end of the memory
- /// allocated for this code buffer.
- uint8_t *BufferBegin, *BufferEnd;
-
- /// CurBufferPtr - Pointer to the next byte of memory to fill when emitting
- /// code. This is guranteed to be in the range [BufferBegin,BufferEnd]. If
- /// this pointer is at BufferEnd, it will never move due to code emission,
- /// and all code emission requests will be ignored (this is the buffer
- /// overflow condition).
- uint8_t *CurBufferPtr;
- public:
- BufferState() : BufferBegin(NULL), BufferEnd(NULL), CurBufferPtr(NULL) {}
- };
-
protected:
- /// These have the same meanings as the fields in BufferState
- uint8_t *BufferBegin, *BufferEnd, *CurBufferPtr;
-
- /// Save or restore the current buffer state. The BufferState objects must be
- /// used as a stack.
- void SaveStateTo(BufferState &BS) {
- assert(BS.BufferBegin == NULL &&
- "Can't save state into the same BufferState twice.");
- BS.BufferBegin = BufferBegin;
- BS.BufferEnd = BufferEnd;
- BS.CurBufferPtr = CurBufferPtr;
- }
- void RestoreStateFrom(BufferState &BS) {
- BufferBegin = BS.BufferBegin;
- BufferEnd = BS.BufferEnd;
- CurBufferPtr = BS.CurBufferPtr;
- }
+ /// BufferBegin/BufferEnd - Pointers to the start and end of the memory
+ /// allocated for this code buffer.
+ uint8_t *BufferBegin, *BufferEnd;
+ /// CurBufferPtr - Pointer to the next byte of memory to fill when emitting
+ /// code. This is guranteed to be in the range [BufferBegin,BufferEnd]. If
+ /// this pointer is at BufferEnd, it will never move due to code emission, and
+ /// all code emission requests will be ignored (this is the buffer overflow
+ /// condition).
+ uint8_t *CurBufferPtr;
public:
virtual ~MachineCodeEmitter() {}
@@ -113,15 +88,23 @@ public:
///
void emitWordLE(uint32_t W) {
if (4 <= BufferEnd-CurBufferPtr) {
- *CurBufferPtr++ = (uint8_t)(W >> 0);
- *CurBufferPtr++ = (uint8_t)(W >> 8);
- *CurBufferPtr++ = (uint8_t)(W >> 16);
- *CurBufferPtr++ = (uint8_t)(W >> 24);
+ emitWordLEInto(CurBufferPtr, W);
} else {
CurBufferPtr = BufferEnd;
}
}
-
+
+ /// emitWordLEInto - This callback is invoked when a 32-bit word needs to be
+ /// written to an arbitrary buffer in little-endian format. Buf must have at
+ /// least 4 bytes of available space.
+ ///
+ static void emitWordLEInto(uint8_t *&Buf, uint32_t W) {
+ *Buf++ = (uint8_t)(W >> 0);
+ *Buf++ = (uint8_t)(W >> 8);
+ *Buf++ = (uint8_t)(W >> 16);
+ *Buf++ = (uint8_t)(W >> 24);
+ }
+
/// emitWordBE - This callback is invoked when a 32-bit word needs to be
/// written to the output stream in big-endian format.
///