[LLVMdev] Being able to know the jitted code-size before emitting

Nicolas Geoffray nicolas.geoffray at lip6.fr
Fri Apr 4 23:16:11 PDT 2008


Evan Cheng wrote:
>
> Let's see. ARM has it already. PPC has getNumBytesForInstruction so  
> you only need to add one to compute function size. Also you only need  
> to implement it for targets that support JIT right now, which leaves  
> Alpha and X86. I'm guessing Alpha is using fixed encoding so it should  
> be pretty easy. Or you can just punt it and let the target maintainers  
> worry about it.
>   

Yeah, fixed encoding like in PPC is easy to handle.

> Really you only need to implement GetFunctionSize for X86 and that's  
> not as horrible as you think it is. For each instruction:
> 1. Compute how many bytes of prefix. The code is there in  
> X86CodeEmitter except all you need is the size, not the prefixes being  
> emitted.
> 2. For each instruction format, e.g AddRegFrm, MRMDestReg, it's either  
> only one single byte for opcode or one additional ModR/M byte. Again,  
> all the information is right there.
> 3. Some memory instructions needs a SIB byte.
> 4. Process the operands! Some special handling for operands that made  
> up of the memory address. But the logic is all there in  
> emitMemModRMByte.
>
> What do you think?
>
>   

That's doable, but I'm afraid I'll have to duplicate many code (eg 
emitMemModRMByte -> sizeMemModRMByte and probably others). That's not a 
problem (I'm thinking bug fixes and improvements, we'll have to handle 
two duplicated code).

Nicolas

> Evan
>
>   
>>     
>>> Suppose you have the size, can't you pass the desired buffer size to
>>> MachineCodeEmitter and have it do the right thing?
>>>       
>> Sure, that's what I'm doing. The emitter with the SizeEmitter class  
>> will
>> give the accurate size to the MachineCodeEmitter. And the
>> MachineCodeEmitter will emit the instructions in the buffer.
>>
>> My solution is surely using things in a way that wasn't intended,  
>> but it
>> works fine and for all targets. Is this really a stopper for  
>> integrating
>> it? (You can see here my laziness on implementing the  
>> GetFunctionSize to
>> every targets :)).
>>
>> Nicolas
>>
>>     
>>> It seems like you
>>> can add the functionality to MachineCodeEmitter rather than add a new
>>> class for it.
>>>
>>> Evan
>>>
>>>
>>>       
>>>> Nicolas
>>>>
>>>>         
>>>>> Thanks,
>>>>>
>>>>> Evan
>>>>>
>>>>> On Mar 30, 2008, at 12:05 PM, Nicolas Geoffray wrote:
>>>>>
>>>>>
>>>>>
>>>>>           
>>>>>> Hi everyone,
>>>>>>
>>>>>> vmkit requires to know the size of a jitted method before emitting
>>>>>> the method. This allows to allocate the correct size for the  
>>>>>> method.
>>>>>> The attached patch creates this functionality when the flag
>>>>>> SizedMemoryCode is on.
>>>>>>
>>>>>> In order to implement this functionality, i had to virtualize some
>>>>>> MachineCodeEmitter functions.
>>>>>>
>>>>>> Is it OK to commit the patch?
>>>>>>
>>>>>> Thanks,
>>>>>> Nicolas
>>>>>> Index: include/llvm/Target/TargetOptions.h
>>>>>> = 
>>>>>> ==================================================================
>>>>>> --- include/llvm/Target/TargetOptions.h (revision 48944)
>>>>>> +++ include/llvm/Target/TargetOptions.h (working copy)
>>>>>> @@ -74,6 +74,10 @@
>>>>>> /// be emitted.
>>>>>> extern bool ExceptionHandling;
>>>>>>
>>>>>> +  /// SizedMemoryCode - This flags indicates that memory for code
>>>>>> is allocated by
>>>>>> +  /// an external allocator which requires the size to allocate
>>>>>> +  extern bool SizedMemoryCode;
>>>>>> +
>>>>>> /// PerformTailCallOpt - This flag is enabled when -tailcallopt is
>>>>>> specified
>>>>>> /// on the commandline. When the flag is on, the target will
>>>>>> perform tail call
>>>>>> /// optimization (pop the caller's stack) providing it supports  
>>>>>> it.
>>>>>> Index: include/llvm/CodeGen/SizeEmitter.h
>>>>>> = 
>>>>>> ==================================================================
>>>>>> --- include/llvm/CodeGen/SizeEmitter.h	(revision 0)
>>>>>> +++ include/llvm/CodeGen/SizeEmitter.h	(revision 0)
>>>>>> @@ -0,0 +1,116 @@
>>>>>> +//===-- llvm/CodeGen/MachineCodeEmitter.h - Code emission  
>>>>>> -------*-
>>>>>> C++ -*-===//
>>>>>> +//
>>>>>> +//                     The LLVM Compiler Infrastructure
>>>>>> +//
>>>>>> +// This file was developed by the LLVM research group and is
>>>>>> distributed under
>>>>>> +// the University of Illinois Open Source License. See  
>>>>>> LICENSE.TXT
>>>>>> for details.
>>>>>> +//
>>>>>> +//
>>>>>> =
>>>>>> =
>>>>>> =
>>>>>> ----------------------------------------------------------------------=
>>>>>> ==//
>>>>>> +//
>>>>>> +// This file defines an abstract interface that is used by the
>>>>>> machine code
>>>>>> +// emission framework to output the code.  This allows machine  
>>>>>> code
>>>>>> emission to
>>>>>> +// be separated from concerns such as resolution of call targets,
>>>>>> and where the
>>>>>> +// machine code will be written (memory or disk, f.e.).
>>>>>> +//
>>>>>> +//
>>>>>> =
>>>>>> =
>>>>>> =
>>>>>> ----------------------------------------------------------------------=
>>>>>> ==//
>>>>>> +
>>>>>> +#ifndef LLVM_CODEGEN_SIZEEMITTER_H
>>>>>> +#define LLVM_CODEGEN_SIZEEMITTER_H
>>>>>> +
>>>>>> +#include "llvm/CodeGen/MachineCodeEmitter.h"
>>>>>> +#include "llvm/CodeGen/MachineFunction.h"
>>>>>> +
>>>>>> +namespace llvm {
>>>>>> +  /// SizeEmitter - The JIT implementation of the
>>>>>> MachineCodeEmitter, which is
>>>>>> +  /// used to output functions to memory for execution.
>>>>>> +class SizeEmitter : public MachineCodeEmitter {
>>>>>> +  MachineFunction * Fn;
>>>>>> +  void* ConstantPoolBase;
>>>>>> +  void* JumpTableBase;
>>>>>> +  MachineConstantPool *ConstantPool;
>>>>>> +  MachineJumpTableInfo *JumpTable;
>>>>>> +  std::vector<intptr_t> LabelLocations;
>>>>>> +  MachineCodeEmitter* MCE;
>>>>>> +
>>>>>> +public:
>>>>>> +  SizeEmitter(MachineCodeEmitter* mce) {
>>>>>> +    CurBufferPtr = 0;
>>>>>> +    BufferBegin = 0;
>>>>>> +    BufferEnd = (unsigned char*)-1;
>>>>>> +    MCE = mce;
>>>>>> +  }
>>>>>> +
>>>>>> +  SizeEmitter(std::vector<intptr_t> locations) {
>>>>>> +    LabelLocations = locations;
>>>>>> +    CurBufferPtr = 0;
>>>>>> +    BufferBegin = 0;
>>>>>> +    BufferEnd = (unsigned char*)-1;
>>>>>> +  }
>>>>>> +
>>>>>> +  void initConstantPool(MachineConstantPool *MCP);
>>>>>> +
>>>>>> +  void initJumpTableInfo(MachineJumpTableInfo *MJTI);
>>>>>> +
>>>>>> +
>>>>>> +  virtual void startFunction(MachineFunction &F) {
>>>>>> +    CurBufferPtr = 0;
>>>>>> +    Fn = &F;
>>>>>> +
>>>>>> +    // Ensure the constant pool/jump table info is at least 4- 
>>>>>> byte
>>>>>> aligned.
>>>>>> +    emitAlignment(16);
>>>>>> +
>>>>>> +    initConstantPool(F.getConstantPool());
>>>>>> +    initJumpTableInfo(F.getJumpTableInfo());
>>>>>> +
>>>>>> +    ConstantPoolBase  = (void*)(((uintptr_t) ConstantPoolBase) +
>>>>>> CurBufferPtr);
>>>>>> +    JumpTableBase     = (void*)(((uintptr_t) JumpTableBase) +
>>>>>> CurBufferPtr);
>>>>>> +  }
>>>>>> +
>>>>>> +  virtual bool finishFunction(MachineFunction &F) {
>>>>>> +    MCE->setCurrentPtr(CurBufferPtr);
>>>>>> +    return false;
>>>>>> +  }
>>>>>> +  virtual void startFunctionStub(unsigned StubSize, unsigned
>>>>>> Alignment) {}
>>>>>> +  virtual void *finishFunctionStub(const Function *F) { return  
>>>>>> 0; }
>>>>>> +  virtual void addRelocation(const llvm::MachineRelocation&) { }
>>>>>> +  virtual void emitByte(unsigned char B) {
>>>>>> +    CurBufferPtr++;
>>>>>> +  }
>>>>>> +  virtual void emitWordLE(unsigned W) {
>>>>>> +    CurBufferPtr+=4;
>>>>>> +  }
>>>>>> +  virtual void emitWordBE(unsigned W) {
>>>>>> +    CurBufferPtr+=4;
>>>>>> +  }
>>>>>> +  virtual void emitInt32(int Value) {
>>>>>> +    CurBufferPtr += 4;
>>>>>> +  }
>>>>>> +  virtual void emitInt64(uint64_t Value) {
>>>>>> +    CurBufferPtr += 8;
>>>>>> +  }
>>>>>> +  virtual void emitAt(uintptr_t *Addr, uintptr_t Value) {
>>>>>> +  }
>>>>>> +
>>>>>> +
>>>>>> +
>>>>>> +  virtual void StartMachineBasicBlock(MachineBasicBlock *MBB) {}
>>>>>> +  virtual intptr_t getConstantPoolEntryAddress(unsigned
>>>>>> ConstantNum) const;
>>>>>> +
>>>>>> +  virtual intptr_t getJumpTableEntryAddress(unsigned Index)  
>>>>>> const;
>>>>>> +
>>>>>> +  virtual intptr_t getMachineBasicBlockAddress(MachineBasicBlock
>>>>>> *MBB) const {
>>>>>> +    assert(0 && "Should not be in getMachineBasicBlockAddress of
>>>>>> SizeEmitter");
>>>>>> +  }
>>>>>> +
>>>>>> +  virtual void emitLabel(uint64_t) {}
>>>>>> +  virtual intptr_t getLabelAddress(uint64_t LabelID) const {
>>>>>> +    assert(LabelLocations.size() > (unsigned)LabelID &&
>>>>>> +             LabelLocations[LabelID] && "Label not emitted!");
>>>>>> +      return LabelLocations[LabelID];
>>>>>> +  }
>>>>>> +  virtual void setModuleInfo(llvm::MachineModuleInfo*) {}
>>>>>> +};
>>>>>> +
>>>>>> +} // end llvm namespace
>>>>>> +
>>>>>> +#endif
>>>>>> Index: include/llvm/CodeGen/MachineCodeEmitter.h
>>>>>> = 
>>>>>> ==================================================================
>>>>>> --- include/llvm/CodeGen/MachineCodeEmitter.h	(revision 48143)
>>>>>> +++ include/llvm/CodeGen/MachineCodeEmitter.h	(working copy)
>>>>>> @@ -18,6 +18,7 @@
>>>>>> #define LLVM_CODEGEN_MACHINECODEEMITTER_H
>>>>>>
>>>>>> #include "llvm/Support/DataTypes.h"
>>>>>> +#include <string>
>>>>>> #include <vector>
>>>>>>
>>>>>> namespace llvm {
>>>>>> @@ -92,7 +93,7 @@
>>>>>> /// emitByte - This callback is invoked when a byte needs to be
>>>>>> written to the
>>>>>> /// output stream.
>>>>>> ///
>>>>>> -  void emitByte(unsigned char B) {
>>>>>> +  virtual void emitByte(unsigned char B) {
>>>>>>   if (CurBufferPtr != BufferEnd)
>>>>>>     *CurBufferPtr++ = B;
>>>>>> }
>>>>>> @@ -100,7 +101,7 @@
>>>>>> /// emitWordLE - This callback is invoked when a 32-bit word needs
>>>>>> to be
>>>>>> /// written to the output stream in little-endian format.
>>>>>> ///
>>>>>> -  void emitWordLE(unsigned W) {
>>>>>> +  virtual void emitWordLE(unsigned W) {
>>>>>>   if (CurBufferPtr+4 <= BufferEnd) {
>>>>>>     *CurBufferPtr++ = (unsigned char)(W >>  0);
>>>>>>     *CurBufferPtr++ = (unsigned char)(W >>  8);
>>>>>> @@ -114,7 +115,7 @@
>>>>>> /// emitWordBE - This callback is invoked when a 32-bit word needs
>>>>>> to be
>>>>>> /// written to the output stream in big-endian format.
>>>>>> ///
>>>>>> -  void emitWordBE(unsigned W) {
>>>>>> +  virtual void emitWordBE(unsigned W) {
>>>>>>   if (CurBufferPtr+4 <= BufferEnd) {
>>>>>>     *CurBufferPtr++ = (unsigned char)(W >> 24);
>>>>>>     *CurBufferPtr++ = (unsigned char)(W >> 16);
>>>>>> @@ -175,7 +176,7 @@
>>>>>> }
>>>>>>
>>>>>> /// emitInt32 - Emit a int32 directive.
>>>>>> -  void emitInt32(int Value) {
>>>>>> +  virtual void emitInt32(int Value) {
>>>>>>   if (CurBufferPtr+4 <= BufferEnd) {
>>>>>>     *((uint32_t*)CurBufferPtr) = Value;
>>>>>>     CurBufferPtr += 4;
>>>>>> @@ -185,7 +186,7 @@
>>>>>> }
>>>>>>
>>>>>> /// emitInt64 - Emit a int64 directive.
>>>>>> -  void emitInt64(uint64_t Value) {
>>>>>> +  virtual void emitInt64(uint64_t Value) {
>>>>>>   if (CurBufferPtr+8 <= BufferEnd) {
>>>>>>     *((uint64_t*)CurBufferPtr) = Value;
>>>>>>     CurBufferPtr += 8;
>>>>>> @@ -195,7 +196,7 @@
>>>>>> }
>>>>>>
>>>>>> /// emitAt - Emit Value in Addr
>>>>>> -  void emitAt(uintptr_t *Addr, uintptr_t Value) {
>>>>>> +  virtual void emitAt(uintptr_t *Addr, uintptr_t Value) {
>>>>>>   if (Addr >= (uintptr_t*)BufferBegin && Addr <
>>>>>> (uintptr_t*)BufferEnd)
>>>>>>     (*Addr) = Value;
>>>>>> }
>>>>>> @@ -270,6 +271,11 @@
>>>>>> /// Specifies the MachineModuleInfo object. This is used for
>>>>>> exception handling
>>>>>> /// purposes.
>>>>>> virtual void setModuleInfo(MachineModuleInfo* Info) = 0;
>>>>>> +
>>>>>> +  void setCurrentPtr(unsigned char* Ptr) {
>>>>>> +    CurBufferPtr = Ptr;
>>>>>> +  }
>>>>>> +
>>>>>> };
>>>>>>
>>>>>> } // End llvm namespace
>>>>>> Index: lib/CodeGen/LLVMTargetMachine.cpp
>>>>>> = 
>>>>>> ==================================================================
>>>>>> --- lib/CodeGen/LLVMTargetMachine.cpp	(revision 48143)
>>>>>> +++ lib/CodeGen/LLVMTargetMachine.cpp	(working copy)
>>>>>> @@ -17,6 +17,7 @@
>>>>>> #include "llvm/Assembly/PrintModulePass.h"
>>>>>> #include "llvm/Analysis/LoopPass.h"
>>>>>> #include "llvm/CodeGen/Passes.h"
>>>>>> +#include "llvm/CodeGen/SizeEmitter.h"
>>>>>> #include "llvm/CodeGen/Collector.h"
>>>>>> #include "llvm/Target/TargetOptions.h"
>>>>>> #include "llvm/Transforms/Scalar.h"
>>>>>> @@ -257,7 +258,13 @@
>>>>>>
>>>>>> if (addPreEmitPass(PM, Fast) && PrintMachineCode)
>>>>>>   PM.add(createMachineFunctionPrinterPass(cerr));
>>>>>> +
>>>>>> +  if (SizedMemoryCode) {
>>>>>> +    SizeEmitter * SE = new SizeEmitter(&MCE);
>>>>>> +    addSimpleCodeEmitter(PM, Fast, false, *SE);
>>>>>> +  }
>>>>>>
>>>>>> +
>>>>>> addCodeEmitter(PM, Fast, PrintEmittedAsm, MCE);
>>>>>>
>>>>>> PM.add(createCollectorMetadataDeleter());
>>>>>> Index: lib/CodeGen/SizeEmitter.cpp
>>>>>> = 
>>>>>> ==================================================================
>>>>>> --- lib/CodeGen/SizeEmitter.cpp	(revision 0)
>>>>>> +++ lib/CodeGen/SizeEmitter.cpp	(revision 0)
>>>>>> @@ -0,0 +1,77 @@
>>>>>> +#include "llvm/CodeGen/SizeEmitter.h"
>>>>>> +#include "llvm/Constant.h"
>>>>>> +#include "llvm/Constants.h"
>>>>>> +#include "llvm/DerivedTypes.h"
>>>>>> +#include "llvm/Module.h"
>>>>>> +#include "llvm/Type.h"
>>>>>> +#include "llvm/CodeGen/MachineCodeEmitter.h"
>>>>>> +#include "llvm/CodeGen/MachineFunction.h"
>>>>>> +#include "llvm/CodeGen/MachineConstantPool.h"
>>>>>> +#include "llvm/CodeGen/MachineJumpTableInfo.h"
>>>>>> +#include "llvm/CodeGen/MachineRelocation.h"
>>>>>> +#include "llvm/ExecutionEngine/GenericValue.h"
>>>>>> +#include "llvm/Target/TargetData.h"
>>>>>> +#include "llvm/Target/TargetJITInfo.h"
>>>>>> +#include "llvm/Target/TargetMachine.h"
>>>>>> +#include "llvm/Target/TargetOptions.h"
>>>>>> +#include "llvm/Support/Debug.h"
>>>>>> +#include "llvm/Support/MutexGuard.h"
>>>>>> +#include "llvm/System/Disassembler.h"
>>>>>> +#include "llvm/ADT/Statistic.h"
>>>>>> +#include "llvm/System/Memory.h"
>>>>>> +#include <algorithm>
>>>>>> +using namespace llvm;
>>>>>> +
>>>>>> +
>>>>>> +void SizeEmitter::initConstantPool(MachineConstantPool *MCP) {
>>>>>> +  const std::vector<MachineConstantPoolEntry> &Constants = MCP-
>>>>>>
>>>>>>
>>>>>>             
>>>>>>> getConstants();
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>> +  if (Constants.empty()) return;
>>>>>> +
>>>>>> +  MachineConstantPoolEntry CPE = Constants.back();
>>>>>> +  unsigned Size = CPE.Offset;
>>>>>> +  const Type *Ty = CPE.isMachineConstantPoolEntry()
>>>>>> +    ? CPE.Val.MachineCPVal->getType() : CPE.Val.ConstVal-
>>>>>>
>>>>>>             
>>>>>>> getType();
>>>>>>>
>>>>>>>               
>>>>>> +  Size += Fn->getTarget().getTargetData()->getABITypeSize(Ty);
>>>>>> +  ConstantPoolBase = allocateSpace(Size, 1 << MCP-
>>>>>>
>>>>>>
>>>>>>             
>>>>>>> getConstantPoolAlignment());
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>> +  ConstantPool = MCP;
>>>>>> +}
>>>>>> +
>>>>>> +void SizeEmitter::initJumpTableInfo(MachineJumpTableInfo *MJTI) {
>>>>>> +  const std::vector<MachineJumpTableEntry> &JT = MJTI-
>>>>>>
>>>>>>
>>>>>>             
>>>>>>> getJumpTables();
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>> +  if (JT.empty()) return;
>>>>>> +
>>>>>> +  unsigned NumEntries = 0;
>>>>>> +  for (unsigned i = 0, e = JT.size(); i != e; ++i)
>>>>>> +    NumEntries += JT[i].MBBs.size();
>>>>>> +
>>>>>> +  unsigned EntrySize = MJTI->getEntrySize();
>>>>>> +
>>>>>> +  // Just allocate space for all the jump tables now.  We will  
>>>>>> fix
>>>>>> up the actual
>>>>>> +  // MBB entries in the tables after we emit the code for each
>>>>>> block, since then
>>>>>> +  // we will know the final locations of the MBBs in memory.
>>>>>> +  JumpTable = MJTI;
>>>>>> +  JumpTableBase = allocateSpace(NumEntries * EntrySize, MJTI-
>>>>>>
>>>>>>
>>>>>>             
>>>>>>> getAlignment());
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>> +}
>>>>>> +
>>>>>> +intptr_t SizeEmitter::getConstantPoolEntryAddress(unsigned
>>>>>> ConstantNum) const {
>>>>>> +  assert(ConstantNum < ConstantPool->getConstants().size() &&
>>>>>> +         "Invalid ConstantPoolIndex!");
>>>>>> +  return (intptr_t)ConstantPoolBase +
>>>>>> +         ConstantPool->getConstants()[ConstantNum].Offset;
>>>>>> +}
>>>>>> +
>>>>>> +intptr_t SizeEmitter::getJumpTableEntryAddress(unsigned Index)
>>>>>> const {
>>>>>> +  const std::vector<MachineJumpTableEntry> &JT = JumpTable-
>>>>>>
>>>>>>
>>>>>>             
>>>>>>> getJumpTables();
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>> +  assert(Index < JT.size() && "Invalid jump table index!");
>>>>>> +
>>>>>> +  unsigned Offset = 0;
>>>>>> +  unsigned EntrySize = JumpTable->getEntrySize();
>>>>>> +
>>>>>> +  for (unsigned i = 0; i < Index; ++i)
>>>>>> +    Offset += JT[i].MBBs.size();
>>>>>> +
>>>>>> +   Offset *= EntrySize;
>>>>>> +
>>>>>> +  return (intptr_t)((char *)JumpTableBase + Offset);
>>>>>> +}
>>>>>> +
>>>>>> Index: lib/Target/TargetMachine.cpp
>>>>>> = 
>>>>>> ==================================================================
>>>>>> --- lib/Target/TargetMachine.cpp	(revision 48143)
>>>>>> +++ lib/Target/TargetMachine.cpp	(working copy)
>>>>>> @@ -31,6 +31,7 @@
>>>>>> bool UseSoftFloat;
>>>>>> bool NoZerosInBSS;
>>>>>> bool ExceptionHandling;
>>>>>> +  bool SizedMemoryCode;
>>>>>> Reloc::Model RelocationModel;
>>>>>> CodeModel::Model CMModel;
>>>>>> bool PerformTailCallOpt;
>>>>>> Index: lib/ExecutionEngine/JIT/JITEmitter.cpp
>>>>>> = 
>>>>>> ==================================================================
>>>>>> --- lib/ExecutionEngine/JIT/JITEmitter.cpp	(revision 48143)
>>>>>> +++ lib/ExecutionEngine/JIT/JITEmitter.cpp	(working copy)
>>>>>> @@ -18,12 +18,14 @@
>>>>>> #include "llvm/Constant.h"
>>>>>> #include "llvm/Module.h"
>>>>>> #include "llvm/Type.h"
>>>>>> +#include "llvm/ADT/DenseMap.h"
>>>>>> #include "llvm/CodeGen/MachineCodeEmitter.h"
>>>>>> #include "llvm/CodeGen/MachineFunction.h"
>>>>>> #include "llvm/CodeGen/MachineConstantPool.h"
>>>>>> #include "llvm/CodeGen/MachineJumpTableInfo.h"
>>>>>> #include "llvm/CodeGen/MachineModuleInfo.h"
>>>>>> #include "llvm/CodeGen/MachineRelocation.h"
>>>>>> +#include "llvm/CodeGen/SizeEmitter.h"
>>>>>> #include "llvm/ExecutionEngine/JITMemoryManager.h"
>>>>>> #include "llvm/Target/TargetData.h"
>>>>>> #include "llvm/Target/TargetJITInfo.h"
>>>>>> @@ -370,6 +376,7 @@
>>>>>>   virtual void startFunction(MachineFunction &F);
>>>>>>   virtual bool finishFunction(MachineFunction &F);
>>>>>>
>>>>>> +    void initConstantPool(MachineConstantPool *MCP);
>>>>>>   void emitConstantPool(MachineConstantPool *MCP);
>>>>>>   void initJumpTableInfo(MachineJumpTableInfo *MJTI);
>>>>>>   void emitJumpTableInfo(MachineJumpTableInfo *MJTI);
>>>>>> @@ -469,19 +476,47 @@
>>>>>>
>>>>>>
>>>>>> void JITEmitter::startFunction(MachineFunction &F) {
>>>>>> -  uintptr_t ActualSize;
>>>>>> -  BufferBegin = CurBufferPtr = MemMgr-
>>>>>>
>>>>>>
>>>>>>             
>>>>>>> startFunctionBody(F.getFunction(),
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>> -
>>>>>> ActualSize);
>>>>>> -  BufferEnd = BufferBegin+ActualSize;
>>>>>> +  MMI->BeginFunction(&F);
>>>>>>
>>>>>> -  // Ensure the constant pool/jump table info is at least 4-byte
>>>>>> aligned.
>>>>>> -  emitAlignment(16);
>>>>>> +  if (SizedMemoryCode) {
>>>>>> +    BufferBegin = CurBufferPtr;
>>>>>> +    BufferEnd = (unsigned char*) 0xffffffff;
>>>>>> +
>>>>>> +    // Ensure the constant pool/jump table info is at least 4- 
>>>>>> byte
>>>>>> aligned.
>>>>>> +    emitAlignment(16);
>>>>>>
>>>>>> -  emitConstantPool(F.getConstantPool());
>>>>>> -  initJumpTableInfo(F.getJumpTableInfo());
>>>>>> +    initConstantPool(F.getConstantPool());
>>>>>> +    initJumpTableInfo(F.getJumpTableInfo());
>>>>>> +
>>>>>> +
>>>>>> +    uintptr_t ActualSize = (uintptr_t)CurBufferPtr;
>>>>>> +    CurBufferPtr = MemMgr->startFunctionBody(F.getFunction(),
>>>>>> +                                             ActualSize);
>>>>>> +
>>>>>> +    ConstantPoolBase  = (void*)(((unsigned) ConstantPoolBase) +
>>>>>> CurBufferPtr);
>>>>>> +    JumpTableBase     = (void*)(((unsigned) JumpTableBase) +
>>>>>> CurBufferPtr);
>>>>>>
>>>>>> -  // About to start emitting the machine code for the function.
>>>>>> -  emitAlignment(std::max(F.getFunction()->getAlignment(), 8U));
>>>>>> +    emitConstantPool(F.getConstantPool());
>>>>>> +
>>>>>> +  } else {
>>>>>> +    uintptr_t ActualSize;
>>>>>> +    BufferBegin = CurBufferPtr = MemMgr-
>>>>>>
>>>>>>
>>>>>>             
>>>>>>> startFunctionBody(F.getFunction(),
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>> +
>>>>>> ActualSize);
>>>>>> +    BufferEnd = BufferBegin+ActualSize;
>>>>>> +
>>>>>> +    // Ensure the constant pool/jump table info is at least 4- 
>>>>>> byte
>>>>>> aligned.
>>>>>> +    emitAlignment(16);
>>>>>> +
>>>>>> +    initConstantPool(F.getConstantPool());
>>>>>> +    emitConstantPool(F.getConstantPool());
>>>>>> +    initJumpTableInfo(F.getJumpTableInfo());
>>>>>> +
>>>>>> +    // About to start emitting the machine code for the function.
>>>>>> +    emitAlignment(std::max(F.getFunction()->getAlignment(), 8U));
>>>>>> +
>>>>>> +  }
>>>>>> +
>>>>>> +
>>>>>> TheJIT->updateGlobalMapping(F.getFunction(), CurBufferPtr);
>>>>>>
>>>>>> MBBLocations.clear();
>>>>>> @@ -579,12 +614,18 @@
>>>>>>   DOUT << "Disassembled code:\n"
>>>>>>        << sys::disassembleBuffer(FnStart, FnEnd-FnStart,
>>>>>> (uintptr_t)FnStart);
>>>>>> #endif
>>>>>> +
>>>>>> if (ExceptionHandling) {
>>>>>>   uintptr_t ActualSize;
>>>>>> +    if (SizedMemoryCode) {
>>>>>> +      SizeEmitter sz(LabelLocations);
>>>>>> +      DE->EmitDwarfTable(F, sz, FnStart, FnEnd);
>>>>>> +      ActualSize = sz.getCurrentPCValue();
>>>>>> +    }
>>>>>>   SavedBufferBegin = BufferBegin;
>>>>>>   SavedBufferEnd = BufferEnd;
>>>>>>   SavedCurBufferPtr = CurBufferPtr;
>>>>>> -
>>>>>> +
>>>>>>   BufferBegin = CurBufferPtr = MemMgr-
>>>>>>
>>>>>>
>>>>>>             
>>>>>>> startExceptionTable(F.getFunction(),
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>> ActualSize);
>>>>>>   BufferEnd = BufferBegin+ActualSize;
>>>>>> @@ -598,11 +639,10 @@
>>>>>>   TheJIT->RegisterTable(FrameRegister);
>>>>>> }
>>>>>> MMI->EndFunction();
>>>>>> -
>>>>>> return false;
>>>>>> }
>>>>>>
>>>>>> -void JITEmitter::emitConstantPool(MachineConstantPool *MCP) {
>>>>>> +void JITEmitter::initConstantPool(MachineConstantPool *MCP) {
>>>>>> const std::vector<MachineConstantPoolEntry> &Constants = MCP-
>>>>>>
>>>>>>
>>>>>>             
>>>>>>> getConstants();
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>> if (Constants.empty()) return;
>>>>>>
>>>>>> @@ -611,12 +651,15 @@
>>>>>> const Type *Ty = CPE.isMachineConstantPoolEntry()
>>>>>>   ? CPE.Val.MachineCPVal->getType() : CPE.Val.ConstVal->getType();
>>>>>> Size += TheJIT->getTargetData()->getABITypeSize(Ty);
>>>>>> -
>>>>>> +
>>>>>> ConstantPoolBase = allocateSpace(Size, 1 << MCP-
>>>>>>
>>>>>>
>>>>>>             
>>>>>>> getConstantPoolAlignment());
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>> ConstantPool = MCP;
>>>>>> +}
>>>>>>
>>>>>> +void JITEmitter::emitConstantPool(MachineConstantPool *MCP) {
>>>>>> if (ConstantPoolBase == 0) return;  // Buffer overflow.
>>>>>>
>>>>>> +  const std::vector<MachineConstantPoolEntry> &Constants = MCP-
>>>>>>
>>>>>>
>>>>>>             
>>>>>>> getConstants();
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>> // Initialize the memory for all of the constant pool entries.
>>>>>> for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
>>>>>>   void *CAddr = (char*)ConstantPoolBase+Constants[i].Offset;
>>>>>> _______________________________________________
>>>>>> LLVM Developers mailing list
>>>>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>>>>
>>>>>>
>>>>>>             
>>>>> _______________________________________________
>>>>> LLVM Developers mailing list
>>>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>>>
>>>>>
>>>>>           
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>>
>>>>         
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>
>>>       
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>     
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>   




More information about the llvm-dev mailing list