LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Static Public Member Functions | Protected Attributes | List of all members
llvm::MachineCodeEmitter Class Referenceabstract

#include <MachineCodeEmitter.h>

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

Public Member Functions

virtual ~MachineCodeEmitter ()
 
virtual void startFunction (MachineFunction &F)=0
 
virtual bool finishFunction (MachineFunction &F)=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 emitULEB128Bytes (uint64_t Value)
 
void emitSLEB128Bytes (uint64_t Value)
 
void emitString (const std::string &String)
 
void emitInt32 (int32_t Value)
 emitInt32 - Emit a int32 directive. More...
 
void emitInt64 (uint64_t Value)
 emitInt64 - Emit a int64 directive. More...
 
void emitInt32At (uintptr_t *Addr, uintptr_t Value)
 emitInt32At - Emit the Int32 Value in Addr. More...
 
void emitInt64At (uintptr_t *Addr, uintptr_t Value)
 emitInt64At - Emit the Int64 Value in Addr. More...
 
virtual void processDebugLoc (DebugLoc DL, bool BeforePrintintInsn)
 
virtual void emitLabel (MCSymbol *Label)=0
 emitLabel - Emits a label More...
 
virtual void * allocateSpace (uintptr_t Size, unsigned Alignment)
 
virtual void StartMachineBasicBlock (MachineBasicBlock *MBB)=0
 
virtual uintptr_t getCurrentPCValue () const
 
virtual uintptr_t getCurrentPCOffset () const
 
virtual bool earlyResolveAddresses () const =0
 
virtual void addRelocation (const MachineRelocation &MR)=0
 
virtual uintptr_t getConstantPoolEntryAddress (unsigned Index) const =0
 FIXME: These should all be handled with relocations! More...
 
virtual uintptr_t getJumpTableEntryAddress (unsigned Index) const =0
 
virtual uintptr_t getMachineBasicBlockAddress (MachineBasicBlock *MBB) const =0
 
virtual uintptr_t getLabelAddress (MCSymbol *Label) const =0
 
virtual void setModuleInfo (MachineModuleInfo *Info)=0
 

Static Public Member Functions

static void emitWordLEInto (uint8_t *&Buf, uint32_t W)
 

Protected Attributes

uint8_t * BufferBegin
 
uint8_t * BufferEnd
 
uint8_t * CurBufferPtr
 

Detailed Description

MachineCodeEmitter - 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 52 of file MachineCodeEmitter.h.

Constructor & Destructor Documentation

virtual llvm::MachineCodeEmitter::~MachineCodeEmitter ( )
inlinevirtual

Definition at line 66 of file MachineCodeEmitter.h.

Member Function Documentation

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

virtual void* llvm::MachineCodeEmitter::allocateSpace ( uintptr_t  Size,
unsigned  Alignment 
)
inlinevirtual

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

Definition at line 258 of file MachineCodeEmitter.h.

References BufferEnd, CurBufferPtr, and emitAlignment().

virtual bool llvm::MachineCodeEmitter::earlyResolveAddresses ( ) const
pure 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.

Implemented in llvm::JITCodeEmitter.

void llvm::MachineCodeEmitter::emitAlignment ( unsigned  Alignment)
inline

emitAlignment - Move the CurBufferPtr pointer up to 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::emitByte ( uint8_t  B)
inline

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

Definition at line 84 of file MachineCodeEmitter.h.

References BufferEnd, and CurBufferPtr.

Referenced by emitSLEB128Bytes(), emitString(), and emitULEB128Bytes().

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::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::emitInt32 ( int32_t  Value)
inline

emitInt32 - Emit a int32 directive.

Definition at line 215 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::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::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 ( MCSymbol Label)
pure virtual

emitLabel - Emits a label

Implemented in llvm::JITCodeEmitter.

void llvm::MachineCodeEmitter::emitSLEB128Bytes ( uint64_t  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, emitByte(), and N.

void llvm::MachineCodeEmitter::emitULEB128Bytes ( uint64_t  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::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.

Definition at line 114 of file MachineCodeEmitter.h.

References BufferEnd, and CurBufferPtr.

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

Definition at line 92 of file MachineCodeEmitter.h.

References BufferEnd, CurBufferPtr, and emitWordLEInto().

static void llvm::MachineCodeEmitter::emitWordLEInto ( uint8_t *&  Buf,
uint32_t  W 
)
inlinestatic

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.

Definition at line 104 of file MachineCodeEmitter.h.

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

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

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

virtual uintptr_t llvm::MachineCodeEmitter::getCurrentPCOffset ( ) const
inlinevirtual

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

Reimplemented in llvm::JITCodeEmitter.

Definition at line 289 of file MachineCodeEmitter.h.

References BufferBegin, and CurBufferPtr.

virtual uintptr_t llvm::MachineCodeEmitter::getCurrentPCValue ( ) const
inlinevirtual

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

Reimplemented in llvm::JITCodeEmitter.

Definition at line 283 of file MachineCodeEmitter.h.

References CurBufferPtr.

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

virtual uintptr_t llvm::MachineCodeEmitter::getLabelAddress ( MCSymbol Label) const
pure virtual

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

Implemented in llvm::JITCodeEmitter.

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

virtual void llvm::MachineCodeEmitter::processDebugLoc ( DebugLoc  DL,
bool  BeforePrintintInsn 
)
inlinevirtual

processDebugLoc - Records debug location information about a MachineInstruction. This is called before emitting any bytes associated with the instruction. Even if successive instructions have the same debug location, this method will be called for each one.

Definition at line 250 of file MachineCodeEmitter.h.

virtual void llvm::MachineCodeEmitter::setModuleInfo ( MachineModuleInfo Info)
pure virtual

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

Implemented in llvm::JITCodeEmitter.

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

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

Member Data Documentation

uint8_t* llvm::MachineCodeEmitter::BufferBegin
protected

BufferBegin/BufferEnd - Pointers to the start and end of the memory allocated for this code buffer.

Definition at line 57 of file MachineCodeEmitter.h.

Referenced by emitInt32At(), llvm::JITCodeEmitter::emitInt32At(), emitInt64At(), llvm::JITCodeEmitter::emitInt64At(), getCurrentPCOffset(), and llvm::JITCodeEmitter::getCurrentPCOffset().

uint8_t * llvm::MachineCodeEmitter::BufferEnd
protected
uint8_t* llvm::MachineCodeEmitter::CurBufferPtr
protected

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