make_procedure_object.c

Go to the documentation of this file.
00001 /**************************************************************************
00002  *
00003  * Copyright (C) 2008, The EROS Group, LLC
00004  * All rights reserved.
00005  *
00006  * Redistribution and use in source and binary forms, with or
00007  * without modification, are permitted provided that the following
00008  * conditions are met:
00009  *
00010  *   - Redistributions of source code must contain the above 
00011  *     copyright notice, this list of conditions, and the following
00012  *     disclaimer. 
00013  *
00014  *   - Redistributions in binary form must reproduce the above
00015  *     copyright notice, this list of conditions, and the following
00016  *     disclaimer in the documentation and/or other materials 
00017  *     provided with the distribution.
00018  *
00019  *   - Neither the names of the copyright holders nor the names of any
00020  *     of any contributors may be used to endorse or promote products
00021  *     derived from this software without specific prior written
00022  *     permission. 
00023  *
00024  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00025  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00026  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00027  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00028  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00029  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00030  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00031  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00032  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00033  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00034  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00035  *
00036  **************************************************************************/
00037 
00038 #include <gc/gc.h>
00039 #include <inttypes.h>
00040 #include "BUILD/bitc-runtime.h"
00041 
00051 void *
00052 bitc_emit_procedure_object(void *stubP, void *envP)
00053 {
00054   //uint32_t envW = (uint32_t) envP;
00055   uint32_t stubW = (uint32_t) stubP;
00056   
00057   bitc_Procedure* proc = GC_ALLOC(sizeof(bitc_Procedure));
00058 
00059   proc->code[0] = 0x90;         /* padding */
00060   proc->code[1] = 0x90;
00061   proc->code[2] = 0x90;
00062 
00063   /* movl $envP,%eax */
00064   proc->code[3] = 0xb8u;        /* MOV imm,%eax */
00065 
00066   /* [4..7] will be filled in via env.ptr */
00067 
00068   /* jmp rel32 */
00069   stubW -= (uint32_t)&proc->code[13];
00070 
00071   proc->code[8] = 0xe9u;
00072   proc->code[9] = stubW;
00073   proc->code[10] = (stubW >> 8);
00074   proc->code[11] = (stubW >> 16);
00075   proc->code[12] = (stubW >> 24);
00076 
00077   proc->env.ptr = envP;
00078 
00079   return proc;
00080 
00081   /* On this architecture, no explicit iCache flush is required as
00082    * long as a branch appears. Return suffices for a branch, which is why
00083    * this must not be an inline procedure. */
00084 }
00085 

Generated on Fri Feb 10 07:59:22 2012 for BitC Runtime Library by  doxygen 1.4.7