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   uint64_t envW = (uint64_t) envP;
00055   uint64_t stubW = (uint64_t) stubP;
00056 
00057   bitc_Procedure* proc = GC_ALLOC(sizeof(bitc_Procedure));
00058 
00059   /* MOVQ $stubW, %rax */
00060   proc->code[0] = 0x48;
00061   proc->code[1] = 0xb8;
00062   proc->code[2] = stubW;
00063   proc->code[3] = (stubW >> 8);
00064   proc->code[4] = (stubW >> 16);
00065   proc->code[5] = (stubW >> 24);
00066   proc->code[6] = (stubW >> 32);
00067   proc->code[7] = (stubW >> 40);
00068   proc->code[8] = (stubW >> 48);
00069   proc->code[9] = (stubW >> 56);
00070 
00071   /* PUSH %rax */
00072   proc->code[10] = 0x50;
00073 
00074   /* NOP, NOP, NOP */
00075   proc->code[11] = 0x90;
00076   proc->code[12] = 0x90;
00077   proc->code[13] = 0x90;
00078 
00079   /* movq $envP,%rax */
00080   proc->code[14] = 0x48u;
00081   proc->code[15] = 0xb8u;
00082 
00083   /* [16..23] will be filled in via env.ptr */
00084 
00085   /* RETQ */
00086   proc->code[24] = 0xc3u;
00087 
00088   proc->env.ptr = envP;
00089 
00090   return proc;
00091 
00092   /* On this architecture, no explicit iCache flush is required as
00093    * long as a branch appears. Return suffices for a branch, which is why
00094    * this must not be an inline procedure. */
00095 }

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