Home | History | Annotate | Download | only in gallivm
      1 /**************************************************************************
      2  *
      3  * Copyright 2009 VMware, Inc.
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the
      8  * "Software"), to deal in the Software without restriction, including
      9  * without limitation the rights to use, copy, modify, merge, publish,
     10  * distribute, sub license, and/or sell copies of the Software, and to
     11  * permit persons to whom the Software is furnished to do so, subject to
     12  * the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the
     15  * next paragraph) shall be included in all copies or substantial portions
     16  * of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     21  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
     22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     25  *
     26  **************************************************************************/
     27 
     28 /**
     29  * @file
     30  * Helper functions for type conversions.
     31  *
     32  * @author Jose Fonseca <jfonseca (at) vmware.com>
     33  */
     34 
     35 
     36 #ifndef LP_BLD_STRUCT_H
     37 #define LP_BLD_STRUCT_H
     38 
     39 
     40 #include "gallivm/lp_bld.h"
     41 #include "gallivm/lp_bld_init.h"
     42 
     43 #include "util/u_debug.h"
     44 #include "util/u_memory.h"
     45 
     46 
     47 #define LP_CHECK_STRUCT_SIZE(_ctype, _ltarget, _ltype) \
     48       assert(LLVMABISizeOfType(_ltarget, _ltype) == \
     49              sizeof(_ctype))
     50 
     51 #define LP_CHECK_MEMBER_OFFSET(_ctype, _cmember, _ltarget, _ltype, _lindex) \
     52       assert(LLVMOffsetOfElement(_ltarget, _ltype, _lindex) == \
     53              offsetof(_ctype, _cmember))
     54 
     55 
     56 /**
     57  * Get value pointer to a structure member.
     58  */
     59 LLVMValueRef
     60 lp_build_struct_get_ptr(struct gallivm_state *gallivm,
     61                         LLVMValueRef ptr,
     62                         unsigned member,
     63                         const char *name);
     64 
     65 /**
     66  * Get the value of a structure member.
     67  */
     68 LLVMValueRef
     69 lp_build_struct_get(struct gallivm_state *gallivm,
     70                     LLVMValueRef ptr,
     71                     unsigned member,
     72                     const char *name);
     73 
     74 /**
     75  * Get value pointer to an array element.
     76  */
     77 LLVMValueRef
     78 lp_build_array_get_ptr(struct gallivm_state *gallivm,
     79                        LLVMValueRef ptr,
     80                        LLVMValueRef index);
     81 
     82 /**
     83  * Get the value of an array element.
     84  */
     85 LLVMValueRef
     86 lp_build_array_get(struct gallivm_state *gallivm,
     87                    LLVMValueRef ptr,
     88                    LLVMValueRef index);
     89 
     90 /**
     91  * Set the value of an array element.
     92  */
     93 void
     94 lp_build_array_set(struct gallivm_state *gallivm,
     95                    LLVMValueRef ptr,
     96                    LLVMValueRef index,
     97                    LLVMValueRef value);
     98 
     99 /**
    100  * Get the value of an array element.
    101  */
    102 LLVMValueRef
    103 lp_build_pointer_get(LLVMBuilderRef builder,
    104                    LLVMValueRef ptr,
    105                    LLVMValueRef index);
    106 
    107 /**
    108  * Get the value of an array element, with explicit alignment.
    109  *
    110  * If the element size is different from the alignment this will
    111  * cause llvm to emit an unaligned load
    112  */
    113 LLVMValueRef
    114 lp_build_pointer_get_unaligned(LLVMBuilderRef builder,
    115                                LLVMValueRef ptr,
    116                                LLVMValueRef index,
    117                                unsigned alignment);
    118 
    119 /**
    120  * Set the value of an array element.
    121  */
    122 void
    123 lp_build_pointer_set(LLVMBuilderRef builder,
    124                      LLVMValueRef ptr,
    125                      LLVMValueRef index,
    126                      LLVMValueRef value);
    127 
    128 /**
    129  * Set the value of an array element, with explicit alignment.
    130  *
    131  * If the element size is different from the alignment this will
    132  * cause llvm to emit an unaligned store
    133  */
    134 void
    135 lp_build_pointer_set_unaligned(LLVMBuilderRef builder,
    136                                LLVMValueRef ptr,
    137                                LLVMValueRef index,
    138                                LLVMValueRef value,
    139                                unsigned alignment);
    140 
    141 #endif /* !LP_BLD_STRUCT_H */
    142