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

信息检索与抽取

开发平台:

Unix_Linux

  1. /* See ../README for copyright */
  2. /*
  3.  * First six arguments are passed in registers with small (< sizeof(void*))
  4.  * values occupying the space of a pointer.
  5.  * If the method returns a structure, it's address is passed as an invisible
  6.  * first argument.
  7.  */
  8. #define MFRAME_STACK_STRUCT 1
  9. #define MFRAME_STRUCT_BYREF     0
  10. #define MFRAME_SMALL_STRUCT     0
  11. #define MFRAME_ARGS_SIZE        104
  12. #define MFRAME_RESULT_SIZE      16
  13. #define MFRAME_FLT_IN_FRAME_AS_DBL      0
  14. /*
  15.  * Structures are passed by reference as an invisible first argument, so
  16.  * they go in the first space on the stack.
  17.  */
  18. #define MFRAME_GET_STRUCT_ADDR(ARGS, TYPES) 
  19. ((*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) ? 
  20.       ((void**)(ARGS))[1] : (void*)0)
  21. #define MFRAME_SET_STRUCT_ADDR(ARGS, TYPES, ADDR) 
  22. ({if (*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) 
  23.       ((void**)(ARGS))[1] = (ADDR);})
  24. #if 0
  25. /*
  26.  * Declare a type for keeping track of the arguments processed.
  27.  */
  28. typedef struct alpha_args {
  29.   int   reg_pos;
  30.   int   stk_pos;
  31. } MFRAME_ARGS;
  32. /*
  33.  * Initialize a variable to keep track of argument info while processing a
  34.  * method.  Keeps count of the offset of arguments on the stack.
  35.  * This offset is adjusted to take account of an invisible first argument
  36.  * used to return structures.
  37.  */
  38. #define MFRAME_INIT_ARGS(CUM, RTYPE) 
  39. ({ 
  40.   (CUM).reg_pos = (*(RTYPE)==_C_STRUCT_B || *(RTYPE)==_C_UNION_B || 
  41.       *(RTYPE)==_C_ARY_B) ? 16 : 8; 
  42.   (CUM).stk_pos = 0; 
  43. })
  44. /*
  45.  * Define maximum register offset - after this, stuff goes on the stack.
  46.  */
  47. #define ALPHAMAXR       56
  48. #define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) 
  49. ({  
  50.   const char* type = (TYPE); 
  51.   int align, size; 
  52.   (TYPE) = objc_skip_typespec(type); 
  53.   align = objc_alignof_type (type); 
  54.   size = objc_sizeof_type (type); 
  55.   size = ROUND(size, sizeof(void*)); 
  56.   if ((CUM).reg_pos + size > ALPHAMAXR) (CUM).reg_pos = ALPHAMAXR; 
  57.   if ((CUM).reg_pos == ALPHAMAXR) 
  58.     { 
  59.       sprintf((DEST), "%.*s%d", (int) ((TYPE)-type), type, (CUM).stk_pos); 
  60.       (CUM).stk_pos += size; 
  61.       (STACK) = (CUM).stk_pos; 
  62.     } 
  63.   else 
  64.     { 
  65.       sprintf((DEST), "%.*s+%d", (int) ((TYPE)-type), type, (CUM).reg_pos); 
  66.       (CUM).reg_pos += size; 
  67.     } 
  68.   (DEST)=&(DEST)[strlen(DEST)]; 
  69.   if (*(TYPE) == '+') 
  70.     { 
  71.       (TYPE)++; 
  72.     } 
  73.   while (isDigit (*(TYPE))) 
  74.     { 
  75.       (TYPE)++; 
  76.     } 
  77. })
  78. #else
  79. struct alpha_args {
  80.   unsigned reg_offset;
  81.   unsigned float_reg_offset;
  82.   unsigned stack_offset;
  83.   unsigned count;
  84. };
  85. #define MFRAME_ARGS struct alpha_args
  86. #define MFRAME_INIT_ARGS(CUM, RTYPE) 
  87. ({ 
  88.  (CUM).reg_offset = 8; 
  89.  (CUM).float_reg_offset = 56; 
  90.  (CUM).stack_offset = 96; 
  91.  (CUM).count = 0; 
  92. })
  93. #define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) 
  94. ({  
  95.   const char* type = (TYPE); 
  96.   const char* outtype = type; 
  97.   unsigned offset; 
  98.   BOOL double_flag = *type == _C_DBL; 
  99.   BOOL float_flag = *type == _C_FLT; 
  100.   BOOL register_flag; 
  101.   
  102.   if (float_flag) 
  103.     outtype = @encode (double); 
  104.   else 
  105.     outtype = type; 
  106.   (TYPE) = objc_skip_typespec (type); 
  107.   
  108.   register_flag = ((CUM).count < 6); 
  109.   offset = register_flag ? ((float_flag || double_flag) 
  110.                              ? (CUM).float_reg_offset 
  111.                              : (CUM).reg_offset) 
  112.                          : (CUM).stack_offset; 
  113.   sprintf ((DEST), "%.*s%s%u", (int) ((TYPE) - type), outtype, 
  114.     register_flag ? "+" : "", offset); 
  115.   if (*(TYPE) == '+') 
  116.     (TYPE)++; 
  117.   while (isDigit (*(TYPE))) 
  118.     { 
  119.       (TYPE)++; 
  120.     } 
  121.   (DEST) = &(DEST)[strlen (DEST)]; 
  122.   if (register_flag) 
  123.     { 
  124.       (CUM).float_reg_offset += 8; 
  125.       (CUM).reg_offset += 8; 
  126.     } 
  127.   else 
  128.     (CUM).stack_offset += 8; 
  129.   (CUM).count++; 
  130. })
  131. #endif