/[qemu]/qemu/thunk.c
ViewVC logotype

Diff of /qemu/thunk.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by bellard, Mon Apr 7 21:35:13 2003 UTC revision 1.4 by bellard, Sun Jun 15 19:52:54 2003 UTC
# Line 29  Line 29 
29  #define MAX_STRUCTS 128  #define MAX_STRUCTS 128
30    
31  /* XXX: make it dynamic */  /* XXX: make it dynamic */
32  static StructEntry struct_entries[MAX_STRUCTS];  StructEntry struct_entries[MAX_STRUCTS];
   
 static inline int thunk_type_size(const argtype *type_ptr, int is_host)  
 {  
     int type, size;  
     const StructEntry *se;  
   
     type = *type_ptr;  
     switch(type) {  
     case TYPE_CHAR:  
         return 1;  
     case TYPE_SHORT:  
         return 2;  
     case TYPE_INT:  
         return 4;  
     case TYPE_LONGLONG:  
     case TYPE_ULONGLONG:  
         return 8;  
     case TYPE_LONG:  
     case TYPE_ULONG:  
     case TYPE_PTRVOID:  
     case TYPE_PTR:  
         if (is_host) {  
             return HOST_LONG_SIZE;  
         } else {  
             return TARGET_LONG_SIZE;  
         }  
         break;  
     case TYPE_ARRAY:  
         size = type_ptr[1];  
         return size * thunk_type_size(type_ptr + 2, is_host);  
     case TYPE_STRUCT:  
         se = struct_entries + type_ptr[1];  
         return se->size[is_host];  
     default:  
         return -1;  
     }  
 }  
   
 static inline int thunk_type_align(const argtype *type_ptr, int is_host)  
 {  
     int type;  
     const StructEntry *se;  
   
     type = *type_ptr;  
     switch(type) {  
     case TYPE_CHAR:  
         return 1;  
     case TYPE_SHORT:  
         return 2;  
     case TYPE_INT:  
         return 4;  
     case TYPE_LONGLONG:  
     case TYPE_ULONGLONG:  
         return 8;  
     case TYPE_LONG:  
     case TYPE_ULONG:  
     case TYPE_PTRVOID:  
     case TYPE_PTR:  
         if (is_host) {  
             return HOST_LONG_SIZE;  
         } else {  
             return TARGET_LONG_SIZE;  
         }  
         break;  
     case TYPE_ARRAY:  
         return thunk_type_align(type_ptr + 2, is_host);  
     case TYPE_STRUCT:  
         se = struct_entries + type_ptr[1];  
         return se->align[is_host];  
     default:  
         return -1;  
     }  
 }  
33    
34  static inline const argtype *thunk_type_next(const argtype *type_ptr)  static inline const argtype *thunk_type_next(const argtype *type_ptr)
35  {  {
# Line 167  void thunk_register_struct(int id, const Line 94  void thunk_register_struct(int id, const
94              offset += size;              offset += size;
95              if (align > max_align)              if (align > max_align)
96                  max_align = align;                  max_align = align;
97                type_ptr = thunk_type_next(type_ptr);
98          }          }
99          offset = (offset + max_align - 1) & ~(max_align - 1);          offset = (offset + max_align - 1) & ~(max_align - 1);
100          se->size[i] = offset;          se->size[i] = offset;

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26