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

信息检索与抽取

开发平台:

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. #if 1
  35. #define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) 
  36. ({ 
  37.   const char* type = (TYPE); 
  38.   size_t align = objc_alignof_type (type); 
  39.   size_t size = objc_sizeof_type (type); 
  40.   unsigned locn; 
  41.   int typelen; 
  42.   
  43.   locn = GET_SPARC_ARG_LOCATION(CUM, type, size); 
  44.   if (locn == ON_STACK) 
  45.     (CUM).offsets[locn] = ROUND ((CUM).offsets[ON_STACK], align); 
  46.   if (size < sizeof (int)) 
  47.     { 
  48.       (CUM).offsets[locn] += sizeof (int) - ROUND (size, align); 
  49.     } 
  50.   (TYPE) = objc_skip_typespec (type); 
  51.   typelen = (TYPE) - type; 
  52.   if (*(TYPE) == '+') 
  53.     (TYPE)++; 
  54.   sprintf ((DEST), "%.*s%s%d", typelen, type, 
  55.     (locn == ON_STACK) ? "" : "+", 
  56.     (CUM).offsets[locn]); 
  57.   while (isDigit (*(TYPE))) 
  58.     { 
  59.       (TYPE)++; 
  60.     } 
  61.   (DEST) = &(DEST)[strlen(DEST)]; 
  62.   if (locn == ON_STACK) 
  63.     { 
  64.       if ((*type==_C_STRUCT_B || *type==_C_UNION_B || *type==_C_ARY_B)) 
  65.   (STACK) = (CUM).offsets[ON_STACK] + ROUND(size, align); 
  66.       else 
  67.   (STACK) = (CUM).offsets[ON_STACK] + size; 
  68.     } 
  69.   (CUM).offsets[locn] += 
  70.     size < sizeof(int) 
  71.       ? ROUND (size, align) 
  72.       : ROUND (size, sizeof(void*)); 
  73. })
  74. #else
  75. #define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) 
  76. ({ 
  77.   const char* type = (TYPE); 
  78.   size_t align = objc_alignof_type (type); 
  79.   size_t size = objc_sizeof_type (type); 
  80.   unsigned locn; 
  81.   int typelen; 
  82.   
  83.   locn = GET_SPARC_ARG_LOCATION(CUM, type, size); 
  84.   (TYPE) = objc_skip_typespec (type); 
  85.   locn = *(TYPE) == '+' ? IN_REGS : ON_STACK; 
  86.   if (locn == IN_REGS) 
  87.     (TYPE)++; 
  88.   (CUM).offsets[locn] = atoi (TYPE); 
  89.   typelen = (TYPE) - type; 
  90.   sprintf ((DEST), "%.*s%d", typelen, type, (CUM).offsets[locn]); 
  91.   while (isDigit (*(TYPE))) 
  92.     { 
  93.       (TYPE)++; 
  94.     } 
  95.   (DEST) = &(DEST)[strlen(DEST)]; 
  96.   if (locn == ON_STACK) 
  97.     { 
  98.       if ((*type==_C_STRUCT_B || *type==_C_UNION_B || *type==_C_ARY_B)) 
  99.   (STACK) = (CUM).offsets[ON_STACK] + ROUND(size, align); 
  100.       else 
  101.   (STACK) = (CUM).offsets[ON_STACK] + size; 
  102.     } 
  103.   (CUM).offsets[locn] += 
  104.     size < sizeof(int) 
  105.       ? ROUND(size, align) 
  106.       : ROUND(size, sizeof(void*)); 
  107. })
  108. #endif