X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FCodeGen%2FMachineCodeEmitter.h;h=018c5e5a3a6b701bf2d3e29aad3a7d4d5cc4afff;hb=80a75bfae980df96f969f1c05b0c4a80ce975240;hp=d26d7e773f454d65c9affc20c856ccc33bd66cf6;hpb=1f4549f35c69376a07360bd57ff06ed8f636d153;p=oota-llvm.git diff --git a/include/llvm/CodeGen/MachineCodeEmitter.h b/include/llvm/CodeGen/MachineCodeEmitter.h index d26d7e773f4..018c5e5a3a6 100644 --- a/include/llvm/CodeGen/MachineCodeEmitter.h +++ b/include/llvm/CodeGen/MachineCodeEmitter.h @@ -18,7 +18,7 @@ #define LLVM_CODEGEN_MACHINECODEEMITTER_H #include "llvm/Support/DataTypes.h" -#include +#include namespace llvm { @@ -65,31 +65,14 @@ public: /// about to be code generated. This initializes the BufferBegin/End/Ptr /// fields. /// - virtual void startFunction(MachineFunction &F) {} + virtual void startFunction(MachineFunction &F) = 0; /// 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. /// - virtual bool finishFunction(MachineFunction &F) { - return CurBufferPtr == BufferEnd; - } - - /// emitConstantPool - This callback is invoked to output the constant pool - /// for the function. - virtual void emitConstantPool(MachineConstantPool *MCP) {} - - /// initJumpTableInfo - This callback is invoked by the JIT to allocate the - /// necessary memory to hold the jump tables. - virtual void initJumpTableInfo(MachineJumpTableInfo *MJTI) {} - - /// emitJumpTableInfo - This callback is invoked to output the jump tables - /// for the function. In addition to a pointer to the MachineJumpTableInfo, - /// this function also takes a map of MBBs to addresses, so that the final - /// addresses of the MBBs can be written to the jump tables. - virtual void emitJumpTableInfo(MachineJumpTableInfo *MJTI, - std::map &MBBM) {} + virtual bool finishFunction(MachineFunction &F) = 0; /// startFunctionStub - This callback is invoked when the JIT needs the /// address of a function that has not been code generated yet. The StubSize @@ -97,12 +80,12 @@ public: /// have constant pools, the can only use the other emitByte*/emitWord* /// methods. /// - virtual void startFunctionStub(unsigned StubSize) {} + virtual void startFunctionStub(unsigned StubSize, unsigned Alignment = 1) = 0; /// finishFunctionStub - This callback is invoked to terminate a function /// stub. /// - virtual void *finishFunctionStub(const Function *F) { return 0; } + virtual void *finishFunctionStub(const Function *F) = 0; /// emitByte - This callback is invoked when a byte needs to be written to the /// output stream. @@ -140,14 +123,23 @@ public: } } + /// emitAlignment - Move the CurBufferPtr pointer up the the specified + /// 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) + CurBufferPtr = BufferEnd; + } + /// 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. void *allocateSpace(intptr_t Size, 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) & ~(Alignment-1)); + emitAlignment(Alignment); void *Result = CurBufferPtr; // Allocate the space. @@ -160,7 +152,11 @@ public: } return Result; } - + + /// 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. + virtual void StartMachineBasicBlock(MachineBasicBlock *MBB) = 0; /// getCurrentPCValue - This returns the address that the next emitted byte /// will be output to. @@ -179,15 +175,24 @@ public: /// noted with this interface. virtual void addRelocation(const MachineRelocation &MR) = 0; + + /// 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. /// - virtual uint64_t getConstantPoolEntryAddress(unsigned Index) = 0; + virtual intptr_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 uint64_t getJumpTableEntryAddress(unsigned Index) = 0; + virtual intptr_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; }; } // End llvm namespace