LLVM API Documentation
#include <MachineCodeEmitter.h>
Public Member Functions | |
| virtual | ~MachineCodeEmitter () |
| virtual void | startFunction (MachineFunction &F)=0 |
| virtual bool | finishFunction (MachineFunction &F)=0 |
| virtual void | startGVStub (const GlobalValue *GV, unsigned StubSize, unsigned Alignment=1)=0 |
| virtual void * | finishGVStub (const GlobalValue *F)=0 |
| void | emitByte (unsigned char B) |
| void | emitWordLE (unsigned W) |
| void | emitWordBE (unsigned W) |
| void | emitDWordLE (uint64_t W) |
| void | emitDWordBE (uint64_t W) |
| void | emitAlignment (unsigned Alignment) |
| void | emitULEB128Bytes (unsigned Value) |
| void | emitSLEB128Bytes (int Value) |
| void | emitString (const std::string &String) |
| void | emitInt32 (int Value) |
| emitInt32 - Emit a int32 directive. | |
| void | emitInt64 (uint64_t Value) |
| emitInt64 - Emit a int64 directive. | |
| void | emitInt32At (uintptr_t *Addr, uintptr_t Value) |
| emitInt32At - Emit the Int32 Value in Addr. | |
| void | emitInt64At (uintptr_t *Addr, uintptr_t Value) |
| emitInt64At - Emit the Int64 Value in Addr. | |
| virtual void | emitLabel (uint64_t LabelID)=0 |
| emitLabel - Emits a label | |
| virtual void * | allocateSpace (uintptr_t Size, unsigned Alignment) |
| virtual void | StartMachineBasicBlock (MachineBasicBlock *MBB)=0 |
| virtual uintptr_t | getCurrentPCValue () const |
| uintptr_t | getCurrentPCOffset () const |
| virtual void | addRelocation (const MachineRelocation &MR)=0 |
| virtual uintptr_t | getConstantPoolEntryAddress (unsigned Index) const =0 |
| FIXME: These should all be handled with relocations! | |
| virtual uintptr_t | getJumpTableEntryAddress (unsigned Index) const =0 |
| virtual uintptr_t | getMachineBasicBlockAddress (MachineBasicBlock *MBB) const =0 |
| virtual uintptr_t | getLabelAddress (uint64_t LabelID) const =0 |
| virtual void | setModuleInfo (MachineModuleInfo *Info)=0 |
Protected Attributes | |
| unsigned char * | BufferBegin |
| unsigned char * | BufferEnd |
| unsigned char * | CurBufferPtr |
Emission of machine code is complicated by the fact that we don't (in general) know the size of the machine code that we're about to emit before we emit it. As such, we preallocate a certain amount of memory, and set the BufferBegin/BufferEnd pointers to the start and end of the buffer. As we emit machine instructions, we advance the CurBufferPtr to indicate the location of the next byte to emit. In the case of a buffer overflow (we need to emit more machine code than we have allocated space for), the CurBufferPtr will saturate to BufferEnd and ignore stores. Once the entire function has been emitted, the overflow condition is checked, and if it has occurred, more memory is allocated, and we reemit the code into it.
Definition at line 49 of file MachineCodeEmitter.h.
| virtual llvm::MachineCodeEmitter::~MachineCodeEmitter | ( | ) | [inline, virtual] |
Definition at line 63 of file MachineCodeEmitter.h.
| virtual void llvm::MachineCodeEmitter::startFunction | ( | MachineFunction & | F | ) | [pure virtual] |
startFunction - This callback is invoked when the specified function is about to be code generated. This initializes the BufferBegin/End/Ptr fields.
Implemented in llvm::ELFCodeEmitter, and llvm::MachOCodeEmitter.
| virtual bool llvm::MachineCodeEmitter::finishFunction | ( | MachineFunction & | F | ) | [pure virtual] |
finishFunction - This callback is invoked when the specified function has finished code generation. If a buffer overflow has occurred, this method returns true (the callee is required to try again), otherwise it returns false.
Implemented in llvm::ELFCodeEmitter, and llvm::MachOCodeEmitter.
| virtual void llvm::MachineCodeEmitter::startGVStub | ( | const GlobalValue * | GV, | |
| unsigned | StubSize, | |||
| unsigned | Alignment = 1 | |||
| ) | [pure virtual] |
startGVStub - This callback is invoked when the JIT needs the address of a GV (e.g. function) that has not been code generated yet. The StubSize specifies the total size required by the stub.
Implemented in llvm::ELFCodeEmitter, and llvm::MachOCodeEmitter.
Referenced by llvm::X86JITInfo::emitFunctionStub(), llvm::PPCJITInfo::emitFunctionStub(), llvm::ARMJITInfo::emitFunctionStub(), llvm::AlphaJITInfo::emitFunctionStub(), llvm::X86JITInfo::emitGlobalValueIndirectSym(), and llvm::ARMJITInfo::emitGlobalValueIndirectSym().
| virtual void* llvm::MachineCodeEmitter::finishGVStub | ( | const GlobalValue * | F | ) | [pure virtual] |
finishGVStub - This callback is invoked to terminate a GV stub.
Implemented in llvm::ELFCodeEmitter, and llvm::MachOCodeEmitter.
Referenced by llvm::X86JITInfo::emitFunctionStub(), llvm::PPCJITInfo::emitFunctionStub(), llvm::ARMJITInfo::emitFunctionStub(), llvm::AlphaJITInfo::emitFunctionStub(), llvm::X86JITInfo::emitGlobalValueIndirectSym(), and llvm::ARMJITInfo::emitGlobalValueIndirectSym().
| void llvm::MachineCodeEmitter::emitByte | ( | unsigned char | B | ) | [inline] |
emitByte - This callback is invoked when a byte needs to be written to the output stream.
Definition at line 92 of file MachineCodeEmitter.h.
References BufferEnd, and CurBufferPtr.
Referenced by llvm::X86JITInfo::emitFunctionStub(), emitSLEB128Bytes(), emitString(), and emitULEB128Bytes().
| void llvm::MachineCodeEmitter::emitWordLE | ( | unsigned | W | ) | [inline] |
emitWordLE - This callback is invoked when a 32-bit word needs to be written to the output stream in little-endian format.
Definition at line 100 of file MachineCodeEmitter.h.
References BufferEnd, and CurBufferPtr.
Referenced by llvm::X86JITInfo::emitFunctionStub(), llvm::ARMJITInfo::emitFunctionStub(), llvm::AlphaJITInfo::emitFunctionStub(), llvm::X86JITInfo::emitGlobalValueIndirectSym(), and llvm::ARMJITInfo::emitGlobalValueIndirectSym().
| void llvm::MachineCodeEmitter::emitWordBE | ( | unsigned | W | ) | [inline] |
emitWordBE - This callback is invoked when a 32-bit word needs to be written to the output stream in big-endian format.
Definition at line 114 of file MachineCodeEmitter.h.
References BufferEnd, and CurBufferPtr.
Referenced by llvm::PPCJITInfo::emitFunctionStub().
| void llvm::MachineCodeEmitter::emitDWordLE | ( | uint64_t | W | ) | [inline] |
emitDWordLE - This callback is invoked when a 64-bit word needs to be written to the output stream in little-endian format.
Definition at line 128 of file MachineCodeEmitter.h.
References BufferEnd, and CurBufferPtr.
| void llvm::MachineCodeEmitter::emitDWordBE | ( | uint64_t | W | ) | [inline] |
emitDWordBE - This callback is invoked when a 64-bit word needs to be written to the output stream in big-endian format.
Definition at line 146 of file MachineCodeEmitter.h.
References BufferEnd, and CurBufferPtr.
| void llvm::MachineCodeEmitter::emitAlignment | ( | unsigned | Alignment | ) | [inline] |
emitAlignment - Move the CurBufferPtr pointer up the the specified alignment (saturated to BufferEnd of course).
Definition at line 163 of file MachineCodeEmitter.h.
References BufferEnd, and CurBufferPtr.
Referenced by allocateSpace().
| void llvm::MachineCodeEmitter::emitULEB128Bytes | ( | unsigned | Value | ) | [inline] |
emitULEB128Bytes - This callback is invoked when a ULEB128 needs to be written to the output stream.
Definition at line 179 of file MachineCodeEmitter.h.
References emitByte().
| void llvm::MachineCodeEmitter::emitSLEB128Bytes | ( | int | Value | ) | [inline] |
emitSLEB128Bytes - This callback is invoked when a SLEB128 needs to be written to the output stream.
Definition at line 190 of file MachineCodeEmitter.h.
References emitByte().
| void llvm::MachineCodeEmitter::emitString | ( | const std::string & | String | ) | [inline] |
emitString - This callback is invoked when a String needs to be written to the output stream.
Definition at line 205 of file MachineCodeEmitter.h.
References llvm::CallingConv::C, and emitByte().
| void llvm::MachineCodeEmitter::emitInt32 | ( | int | Value | ) | [inline] |
emitInt32 - Emit a int32 directive.
Definition at line 215 of file MachineCodeEmitter.h.
References BufferEnd, and CurBufferPtr.
| void llvm::MachineCodeEmitter::emitInt64 | ( | uint64_t | Value | ) | [inline] |
emitInt64 - Emit a int64 directive.
Definition at line 225 of file MachineCodeEmitter.h.
References BufferEnd, and CurBufferPtr.
| void llvm::MachineCodeEmitter::emitInt32At | ( | uintptr_t * | Addr, | |
| uintptr_t | Value | |||
| ) | [inline] |
emitInt32At - Emit the Int32 Value in Addr.
Definition at line 235 of file MachineCodeEmitter.h.
References BufferBegin, and BufferEnd.
| void llvm::MachineCodeEmitter::emitInt64At | ( | uintptr_t * | Addr, | |
| uintptr_t | Value | |||
| ) | [inline] |
emitInt64At - Emit the Int64 Value in Addr.
Definition at line 241 of file MachineCodeEmitter.h.
References BufferBegin, and BufferEnd.
| virtual void llvm::MachineCodeEmitter::emitLabel | ( | uint64_t | LabelID | ) | [pure virtual] |
| virtual void* llvm::MachineCodeEmitter::allocateSpace | ( | uintptr_t | Size, | |
| unsigned | Alignment | |||
| ) | [inline, virtual] |
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.
Definition at line 253 of file MachineCodeEmitter.h.
References BufferEnd, CurBufferPtr, and emitAlignment().
Referenced by llvm::JIT::getOrEmitGlobalVariable().
| virtual void llvm::MachineCodeEmitter::StartMachineBasicBlock | ( | MachineBasicBlock * | MBB | ) | [pure virtual] |
StartMachineBasicBlock - This should be called by the target when a new basic block is about to be emitted. This way the MCE knows where the start of the block is, and can implement getMachineBasicBlockAddress.
Implemented in llvm::ELFCodeEmitter, and llvm::MachOCodeEmitter.
| virtual uintptr_t llvm::MachineCodeEmitter::getCurrentPCValue | ( | ) | const [inline, virtual] |
getCurrentPCValue - This returns the address that the next emitted byte will be output to.
Definition at line 278 of file MachineCodeEmitter.h.
References CurBufferPtr.
Referenced by llvm::X86JITInfo::emitFunctionStub(), llvm::PPCJITInfo::emitFunctionStub(), llvm::ARMJITInfo::emitFunctionStub(), and llvm::AlphaJITInfo::emitFunctionStub().
| uintptr_t llvm::MachineCodeEmitter::getCurrentPCOffset | ( | ) | const [inline] |
getCurrentPCOffset - Return the offset from the start of the emitted buffer that we are currently writing to.
Definition at line 284 of file MachineCodeEmitter.h.
References BufferBegin, and CurBufferPtr.
| virtual void llvm::MachineCodeEmitter::addRelocation | ( | const MachineRelocation & | MR | ) | [pure virtual] |
addRelocation - Whenever a relocatable address is needed, it should be noted with this interface.
Implemented in llvm::ELFCodeEmitter, and llvm::MachOCodeEmitter.
| virtual uintptr_t llvm::MachineCodeEmitter::getConstantPoolEntryAddress | ( | unsigned | Index | ) | const [pure virtual] |
FIXME: These should all be handled with relocations!
getConstantPoolEntryAddress - Return the address of the 'Index' entry in the constant pool that was last emitted with the emitConstantPool method.
Implemented in llvm::ELFCodeEmitter, and llvm::MachOCodeEmitter.
| virtual uintptr_t llvm::MachineCodeEmitter::getJumpTableEntryAddress | ( | unsigned | Index | ) | const [pure virtual] |
getJumpTableEntryAddress - Return the address of the jump table with index 'Index' in the function that last called initJumpTableInfo.
Implemented in llvm::ELFCodeEmitter, and llvm::MachOCodeEmitter.
| virtual uintptr_t llvm::MachineCodeEmitter::getMachineBasicBlockAddress | ( | MachineBasicBlock * | MBB | ) | const [pure virtual] |
getMachineBasicBlockAddress - Return the address of the specified MachineBasicBlock, only usable after the label for the MBB has been emitted.
Implemented in llvm::ELFCodeEmitter, and llvm::MachOCodeEmitter.
| virtual uintptr_t llvm::MachineCodeEmitter::getLabelAddress | ( | uint64_t | LabelID | ) | const [pure virtual] |
getLabelAddress - Return the address of the specified LabelID, only usable after the LabelID has been emitted.
Implemented in llvm::ELFCodeEmitter, and llvm::MachOCodeEmitter.
| virtual void llvm::MachineCodeEmitter::setModuleInfo | ( | MachineModuleInfo * | Info | ) | [pure virtual] |
Specifies the MachineModuleInfo object. This is used for exception handling purposes.
Implemented in llvm::ELFCodeEmitter, and llvm::MachOCodeEmitter.
unsigned char* llvm::MachineCodeEmitter::BufferBegin [protected] |
BufferBegin/BufferEnd - Pointers to the start and end of the memory allocated for this code buffer.
Definition at line 53 of file MachineCodeEmitter.h.
Referenced by emitInt32At(), emitInt64At(), llvm::MachOCodeEmitter::finishFunction(), getCurrentPCOffset(), and llvm::MachOCodeEmitter::startFunction().
unsigned char * llvm::MachineCodeEmitter::BufferEnd [protected] |
Definition at line 53 of file MachineCodeEmitter.h.
Referenced by allocateSpace(), emitAlignment(), emitByte(), emitDWordBE(), emitDWordLE(), emitInt32(), emitInt32At(), emitInt64(), emitInt64At(), emitWordBE(), emitWordLE(), and llvm::MachOCodeEmitter::startFunction().
unsigned char* llvm::MachineCodeEmitter::CurBufferPtr [protected] |
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).
Definition at line 60 of file MachineCodeEmitter.h.
Referenced by allocateSpace(), emitAlignment(), emitByte(), emitDWordBE(), emitDWordLE(), emitInt32(), emitInt64(), emitWordBE(), emitWordLE(), llvm::MachOCodeEmitter::finishFunction(), getCurrentPCOffset(), getCurrentPCValue(), and llvm::MachOCodeEmitter::startFunction().