mframe-generic.h
上传用户:shenzhenrh
上传日期:2013-05-12
资源大小:2904k
文件大小:2k
源码类别:

信息检索与抽取

开发平台:

Unix_Linux

  1. /* See ../README for copyright */
  2. #define MFRAME_STACK_STRUCT 0
  3. #define MFRAME_STRUCT_BYREF 1
  4. #define MFRAME_SMALL_STRUCT 0
  5. #define MFRAME_ARGS_SIZE 32
  6. #define MFRAME_RESULT_SIZE 16
  7. #define MFRAME_GET_STRUCT_ADDR(ARGS, TYPES) 
  8. ((*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) ? 
  9.       *(void**)((ARGS)->arg_regs+sizeof(void*)): (void*)0)
  10. #define MFRAME_SET_STRUCT_ADDR(ARGS, TYPES, ADDR) 
  11. ({if (*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) 
  12.       *(void**)((ARGS)->arg_regs+sizeof(void*)) = (ADDR);})
  13. #define IN_REGS 0
  14. #define ON_STACK 1
  15. struct sparc_args {
  16.   int offsets[2];   /* 0 for args in regs, 1 for the rest of args on stack */
  17.   int onStack;
  18. };
  19. #define MFRAME_ARGS struct sparc_args
  20. #define MFRAME_INIT_ARGS(CUM, RTYPE)
  21. ({ 
  22.   (CUM).offsets[0] = 8; /* encoding in regs starts from 8 */ 
  23.   (CUM).offsets[1] = 20; /* encoding on stack starts from 20 or 24 */ 
  24.   (CUM).onStack = NO; 
  25. })
  26. #define GET_SPARC_ARG_LOCATION(CUM, CSTRING_TYPE, TYPESIZE) 
  27. ((CUM).onStack 
  28.   ? ON_STACK 
  29.   : ((CUM).offsets[IN_REGS] + TYPESIZE <= 6 * sizeof(int) + 8 
  30.     ? (((CUM).offsets[IN_REGS] + TYPESIZE <= 6 * sizeof(int) + 4 
  31.       ? 0 : ((CUM).offsets[ON_STACK] += 4)),
  32.       IN_REGS) 
  33.     : ((CUM).onStack = YES, ON_STACK)))
  34. #define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) 
  35. ({  
  36.   const char* type = (TYPE); 
  37.   int align = objc_alignof_type(type); 
  38.   int size = objc_sizeof_type(type); 
  39.   int locn = GET_SPARC_ARG_LOCATION(CUM, type, size); 
  40.   (CUM).offsets[locn] = ROUND((CUM).offsets[locn], align); 
  41.   if (size < sizeof(int)) 
  42.     { 
  43.       (CUM).offsets[locn] += sizeof(int) - ROUND(size, align); 
  44.     } 
  45.   (TYPE) = objc_skip_typespec(type); 
  46.   if (locn == IN_REGS) 
  47.     { 
  48.       sprintf((DEST), "%.*s+%d", (TYPE)-type, type, (CUM).offsets[locn]); 
  49.     } 
  50.   else 
  51.     { 
  52.       sprintf((DEST), "%.*s%d", (TYPE)-type, type, (CUM).offsets[locn]); 
  53.     } 
  54.   if (*(TYPE) == '+') 
  55.     { 
  56.       (TYPE)++; 
  57.     } 
  58.   while (isDigit (*(TYPE))) 
  59.     { 
  60.       (TYPE)++; 
  61.     } 
  62.   (DEST)=&(DEST)[strlen(DEST)]; 
  63.   if (locn == ON_STACK) 
  64.     { 
  65.       if ((*type==_C_STRUCT_B || *type==_C_UNION_B || *type==_C_ARY_B)) 
  66.   (STACK) = (CUM).offsets[ON_STACK] + ROUND(size, align); 
  67.       else 
  68.   (STACK) = (CUM).offsets[ON_STACK] + size; 
  69.     } 
  70.   (CUM).offsets[locn] += 
  71.     size < sizeof(int) 
  72.       ? ROUND(size, align) 
  73.       : ROUND(size, sizeof(void*)); 
  74. })