LLVM API Documentation

Public Member Functions
llvm::JITCodeEmitter Class Reference

#include <JITCodeEmitter.h>

Inheritance diagram for llvm::JITCodeEmitter:
Inheritance graph
[legend]
Collaboration diagram for llvm::JITCodeEmitter:
Collaboration graph
[legend]

List of all members.

Public Member Functions

virtual ~JITCodeEmitter ()
void startFunction (MachineFunction &F) override=0
bool finishFunction (MachineFunction &F) override=0
virtual void * allocIndirectGV (const GlobalValue *GV, const uint8_t *Buffer, size_t Size, unsigned Alignment)=0
void emitByte (uint8_t B)
void emitWordLE (uint32_t W)
void emitWordBE (uint32_t W)
void emitDWordLE (uint64_t W)
void emitDWordBE (uint64_t W)
void emitAlignment (unsigned Alignment)
void emitAlignmentWithFill (unsigned Alignment, uint8_t Fill)
void emitULEB128Bytes (uint64_t Value, unsigned PadTo=0)
void emitSLEB128Bytes (int64_t Value)
void emitString (const std::string &String)
void emitInt32 (uint32_t 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.
void emitLabel (MCSymbol *Label) override=0
 emitLabel - Emits a label
void * allocateSpace (uintptr_t Size, unsigned Alignment) override
virtual void * allocateGlobal (uintptr_t Size, unsigned Alignment)=0
void StartMachineBasicBlock (MachineBasicBlock *MBB) override=0
uintptr_t getCurrentPCValue () const override
uintptr_t getCurrentPCOffset () const override
bool earlyResolveAddresses () const override
void addRelocation (const MachineRelocation &MR) override=0
uintptr_t getConstantPoolEntryAddress (unsigned Index) const override=0
 FIXME: These should all be handled with relocations!
uintptr_t getJumpTableEntryAddress (unsigned Index) const override=0
uintptr_t getMachineBasicBlockAddress (MachineBasicBlock *MBB) const override=0
uintptr_t getLabelAddress (MCSymbol *Label) const override=0
void setModuleInfo (MachineModuleInfo *Info) override=0
virtual DenseMap< MCSymbol
*, uintptr_t > * 
getLabelLocations ()

Detailed Description

JITCodeEmitter - This class defines two sorts of methods: those for emitting the actual bytes of machine code, and those for emitting auxiliary structures, such as jump tables, relocations, etc.

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 53 of file JITCodeEmitter.h.


Constructor & Destructor Documentation

virtual llvm::JITCodeEmitter::~JITCodeEmitter ( ) [inline, virtual]

Definition at line 56 of file JITCodeEmitter.h.


Member Function Documentation

void llvm::JITCodeEmitter::addRelocation ( const MachineRelocation MR) [override, pure virtual]

addRelocation - Whenever a relocatable address is needed, it should be noted with this interface.

Implements llvm::MachineCodeEmitter.

virtual void* llvm::JITCodeEmitter::allocateGlobal ( uintptr_t  Size,
unsigned  Alignment 
) [pure virtual]

allocateGlobal - Allocate memory for a global. Unlike allocateSpace, this method does not allocate memory in the current output buffer, because a global may live longer than the current function.

Referenced by llvm::JIT::getMemoryForGV().

void* llvm::JITCodeEmitter::allocateSpace ( uintptr_t  Size,
unsigned  Alignment 
) [inline, override, 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.

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 256 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferEnd, llvm::MachineCodeEmitter::CurBufferPtr, and emitAlignment().

Referenced by llvm::JIT::getMemoryForGV().

virtual void* llvm::JITCodeEmitter::allocIndirectGV ( const GlobalValue GV,
const uint8_t *  Buffer,
size_t  Size,
unsigned  Alignment 
) [pure virtual]

allocIndirectGV - Allocates and fills storage for an indirect GlobalValue, and returns the address.

Referenced by llvm::X86JITInfo::emitGlobalValueIndirectSym(), and llvm::ARMJITInfo::emitGlobalValueIndirectSym().

bool llvm::JITCodeEmitter::earlyResolveAddresses ( ) const [inline, override, virtual]

earlyResolveAddresses - True if the code emitter can use symbol addresses during code emission time. The JIT is capable of doing this because it creates jump tables or constant pools in memory on the fly while the object code emitters rely on a linker to have real addresses and should use relocations instead.

Implements llvm::MachineCodeEmitter.

Definition at line 301 of file JITCodeEmitter.h.

void llvm::JITCodeEmitter::emitAlignment ( unsigned  Alignment) [inline]

emitAlignment - Move the CurBufferPtr pointer up to the specified alignment (saturated to BufferEnd of course).

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 151 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferEnd, llvm::MachineCodeEmitter::CurBufferPtr, and llvm::RoundUpToAlignment().

Referenced by allocateSpace(), llvm::SparcJITInfo::emitFunctionStub(), llvm::MipsJITInfo::emitFunctionStub(), llvm::X86JITInfo::emitFunctionStub(), and llvm::ARMJITInfo::emitFunctionStub().

void llvm::JITCodeEmitter::emitAlignmentWithFill ( unsigned  Alignment,
uint8_t  Fill 
) [inline]

emitAlignmentWithFill - Similar to emitAlignment, except that the extra bytes are filled with the provided byte.

Definition at line 160 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferEnd, llvm::MachineCodeEmitter::CurBufferPtr, and llvm::RoundUpToAlignment().

void llvm::JITCodeEmitter::emitByte ( uint8_t  B) [inline]

emitByte - This callback is invoked when a byte needs to be written to the output stream.

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 80 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferEnd, and llvm::MachineCodeEmitter::CurBufferPtr.

Referenced by llvm::X86JITInfo::emitFunctionStub(), emitSLEB128Bytes(), emitString(), and emitULEB128Bytes().

void llvm::JITCodeEmitter::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.

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 134 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferEnd, and llvm::MachineCodeEmitter::CurBufferPtr.

void llvm::JITCodeEmitter::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.

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 116 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferEnd, and llvm::MachineCodeEmitter::CurBufferPtr.

void llvm::JITCodeEmitter::emitInt32 ( uint32_t  Value) [inline]

emitInt32 - Emit a int32 directive.

Definition at line 218 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferEnd, and llvm::MachineCodeEmitter::CurBufferPtr.

void llvm::JITCodeEmitter::emitInt32At ( uintptr_t *  Addr,
uintptr_t  Value 
) [inline]

emitInt32At - Emit the Int32 Value in Addr.

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 238 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferBegin, and llvm::MachineCodeEmitter::BufferEnd.

void llvm::JITCodeEmitter::emitInt64 ( uint64_t  Value) [inline]

emitInt64 - Emit a int64 directive.

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 228 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferEnd, and llvm::MachineCodeEmitter::CurBufferPtr.

void llvm::JITCodeEmitter::emitInt64At ( uintptr_t *  Addr,
uintptr_t  Value 
) [inline]

emitInt64At - Emit the Int64 Value in Addr.

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 244 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferBegin, and llvm::MachineCodeEmitter::BufferEnd.

void llvm::JITCodeEmitter::emitLabel ( MCSymbol Label) [override, pure virtual]

emitLabel - Emits a label

Implements llvm::MachineCodeEmitter.

void llvm::JITCodeEmitter::emitSLEB128Bytes ( int64_t  Value) [inline]

emitSLEB128Bytes - This callback is invoked when a SLEB128 needs to be written to the output stream.

Definition at line 194 of file JITCodeEmitter.h.

References emitByte().

void llvm::JITCodeEmitter::emitString ( const std::string &  String) [inline]

emitString - This callback is invoked when a String needs to be written to the output stream.

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 209 of file JITCodeEmitter.h.

References llvm::CallingConv::C, emitByte(), and N.

void llvm::JITCodeEmitter::emitULEB128Bytes ( uint64_t  Value,
unsigned  PadTo = 0 
) [inline]

emitULEB128Bytes - This callback is invoked when a ULEB128 needs to be written to the output stream.

Definition at line 176 of file JITCodeEmitter.h.

References emitByte().

void llvm::JITCodeEmitter::emitWordBE ( uint32_t  W) [inline]

emitWordBE - This callback is invoked when a 32-bit word needs to be written to the output stream in big-endian format.

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 102 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferEnd, and llvm::MachineCodeEmitter::CurBufferPtr.

Referenced by llvm::PPCJITInfo::emitFunctionStub(), llvm::SparcJITInfo::emitFunctionStub(), and llvm::MipsJITInfo::emitFunctionStub().

void llvm::JITCodeEmitter::emitWordLE ( uint32_t  W) [inline]

emitWordLE - This callback is invoked when a 32-bit word needs to be written to the output stream in little-endian format.

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 88 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferEnd, and llvm::MachineCodeEmitter::CurBufferPtr.

Referenced by llvm::MipsJITInfo::emitFunctionStub(), llvm::X86JITInfo::emitFunctionStub(), and llvm::ARMJITInfo::emitFunctionStub().

bool llvm::JITCodeEmitter::finishFunction ( MachineFunction F) [override, 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.

Implements llvm::MachineCodeEmitter.

uintptr_t llvm::JITCodeEmitter::getConstantPoolEntryAddress ( unsigned  Index) const [override, 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.

Implements llvm::MachineCodeEmitter.

uintptr_t llvm::JITCodeEmitter::getCurrentPCOffset ( ) const [inline, override, virtual]

getCurrentPCOffset - Return the offset from the start of the emitted buffer that we are currently writing to.

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 292 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::BufferBegin, and llvm::MachineCodeEmitter::CurBufferPtr.

uintptr_t llvm::JITCodeEmitter::getCurrentPCValue ( ) const [inline, override, virtual]

getCurrentPCValue - This returns the address that the next emitted byte will be output to.

Reimplemented from llvm::MachineCodeEmitter.

Definition at line 286 of file JITCodeEmitter.h.

References llvm::MachineCodeEmitter::CurBufferPtr.

Referenced by llvm::PPCJITInfo::emitFunctionStub(), llvm::SparcJITInfo::emitFunctionStub(), llvm::MipsJITInfo::emitFunctionStub(), llvm::X86JITInfo::emitFunctionStub(), and llvm::ARMJITInfo::emitFunctionStub().

uintptr_t llvm::JITCodeEmitter::getJumpTableEntryAddress ( unsigned  Index) const [override, pure virtual]

getJumpTableEntryAddress - Return the address of the jump table with index 'Index' in the function that last called initJumpTableInfo.

Implements llvm::MachineCodeEmitter.

uintptr_t llvm::JITCodeEmitter::getLabelAddress ( MCSymbol Label) const [override, pure virtual]

getLabelAddress - Return the address of the specified Label, only usable after the Label has been emitted.

Implements llvm::MachineCodeEmitter.

virtual DenseMap<MCSymbol*, uintptr_t>* llvm::JITCodeEmitter::getLabelLocations ( ) [inline, virtual]

getLabelLocations - Return the label locations map of the label IDs to their address.

Definition at line 337 of file JITCodeEmitter.h.

uintptr_t llvm::JITCodeEmitter::getMachineBasicBlockAddress ( MachineBasicBlock MBB) const [override, pure virtual]

getMachineBasicBlockAddress - Return the address of the specified MachineBasicBlock, only usable after the label for the MBB has been emitted.

Implements llvm::MachineCodeEmitter.

void llvm::JITCodeEmitter::setModuleInfo ( MachineModuleInfo Info) [override, pure virtual]

Specifies the MachineModuleInfo object. This is used for exception handling purposes.

Implements llvm::MachineCodeEmitter.

void llvm::JITCodeEmitter::startFunction ( MachineFunction F) [override, pure virtual]

startFunction - This callback is invoked when the specified function is about to be code generated. This initializes the BufferBegin/End/Ptr fields.

Implements llvm::MachineCodeEmitter.

void llvm::JITCodeEmitter::StartMachineBasicBlock ( MachineBasicBlock MBB) [override, 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.

Implements llvm::MachineCodeEmitter.


The documentation for this class was generated from the following files: