Allow target to specify alignment for function stub.
authorEvan Cheng <evan.cheng@apple.com>
Thu, 16 Nov 2006 20:04:54 +0000 (20:04 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 16 Nov 2006 20:04:54 +0000 (20:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31788 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineCodeEmitter.h
lib/ExecutionEngine/JIT/JITEmitter.cpp

index 758a16730984dc752869e5ca4a08ba3d24488f6e..018c5e5a3a6b701bf2d3e29aad3a7d4d5cc4afff 100644 (file)
@@ -80,7 +80,7 @@ public:
   /// have constant pools, the can only use the other emitByte*/emitWord*
   /// methods.
   ///
-  virtual void startFunctionStub(unsigned StubSize) = 0;
+  virtual void startFunctionStub(unsigned StubSize, unsigned Alignment = 1) = 0;
 
   /// finishFunctionStub - This callback is invoked to terminate a function
   /// stub.
index 1c2d5d3185ae7be7ef0903466ee190880d80cbde..e9b630b1b73b5628f33b7dfa97fe59aa249db4d1 100644 (file)
@@ -275,7 +275,7 @@ namespace {
     JITMemoryManager(bool useGOT);
     ~JITMemoryManager();
 
-    inline unsigned char *allocateStub(unsigned StubSize);
+    inline unsigned char *allocateStub(unsigned StubSize, unsigned Alignment);
     
     /// startFunctionBody - When a function starts, allocate a block of free
     /// executable memory, returning a pointer to it and its actual size.
@@ -403,8 +403,11 @@ JITMemoryManager::~JITMemoryManager() {
   Blocks.clear();
 }
 
-unsigned char *JITMemoryManager::allocateStub(unsigned StubSize) {
+unsigned char *JITMemoryManager::allocateStub(unsigned StubSize,
+                                              unsigned Alignment) {
   CurStubPtr -= StubSize;
+  CurStubPtr = (unsigned char*)(((intptr_t)CurStubPtr) &
+                                ~(intptr_t)(Alignment-1));
   if (CurStubPtr < StubBase) {
     // FIXME: allocate a new block
     std::cerr << "JIT ran out of memory for function stubs!\n";
@@ -700,7 +703,7 @@ public:
     void initJumpTableInfo(MachineJumpTableInfo *MJTI);
     void emitJumpTableInfo(MachineJumpTableInfo *MJTI);
     
-    virtual void startFunctionStub(unsigned StubSize);
+    virtual void startFunctionStub(unsigned StubSize, unsigned Alignment = 1);
     virtual void* finishFunctionStub(const Function *F);
 
     virtual void addRelocation(const MachineRelocation &MR) {
@@ -769,6 +772,9 @@ void JITEmitter::startFunction(MachineFunction &F) {
   BufferBegin = CurBufferPtr = MemMgr.startFunctionBody(ActualSize);
   BufferEnd = BufferBegin+ActualSize;
   
+  // Ensure the constant pool/jump table info is at least 4-byte aligned.
+  emitAlignment(16);
+
   emitConstantPool(F.getConstantPool());
   initJumpTableInfo(F.getJumpTableInfo());
 
@@ -928,12 +934,12 @@ void JITEmitter::emitJumpTableInfo(MachineJumpTableInfo *MJTI) {
   }
 }
 
-void JITEmitter::startFunctionStub(unsigned StubSize) {
+void JITEmitter::startFunctionStub(unsigned StubSize, unsigned Alignment) {
   SavedBufferBegin = BufferBegin;
   SavedBufferEnd = BufferEnd;
   SavedCurBufferPtr = CurBufferPtr;
   
-  BufferBegin = CurBufferPtr = MemMgr.allocateStub(StubSize);
+  BufferBegin = CurBufferPtr = MemMgr.allocateStub(StubSize, Alignment);
   BufferEnd = BufferBegin+StubSize+1;
 }