Annotation of GNUtools/cc/config/pa/next.c, revision 1.1

1.1     ! root        1: 
        !             2: /* next.c:  Functions for NeXT as target machine for GNU C compiler.  */
        !             3: 
        !             4: #include "pa/pa.c"
        !             5: #include "nextstep.c"
        !             6: #include "machopic.h"
        !             7: 
        !             8: void add_vararg_func PROTO((char *, char));
        !             9: int check_vararg_func PROTO((char *));
        !            10: int check_duplicate_entry PROTO((char *));
        !            11: 
        !            12: #define STUB_LABEL_NAME(STUB)     TREE_VALUE (STUB)
        !            13: #define STUB_FUNCTION_NAME(STUB)  TREE_PURPOSE (STUB)
        !            14: #define STUB_LINE_NUMBER(STUB)    TREE_INT_CST_LOW (TREE_TYPE (STUB))
        !            15: 
        !            16: static tree stub_list = 0;
        !            17: 
        !            18: /* Following function adds the compiler generated stub for handling 
        !            19:    procedure calls to the linked list.
        !            20: */
        !            21: 
        !            22: void 
        !            23: add_compiler_stub(label_name, function_name, line_number)
        !            24:      tree label_name;
        !            25:      tree function_name;
        !            26:      int line_number;
        !            27: {
        !            28:   tree stub;
        !            29:   
        !            30:   stub = build_tree_list (function_name, label_name);
        !            31:   TREE_TYPE (stub) = build_int_2 (line_number, 0);
        !            32:   TREE_CHAIN (stub) = stub_list;
        !            33:   stub_list = stub;
        !            34: }
        !            35: 
        !            36: /* Following function outputs the compiler generated stub for handling 
        !            37:    procedure calls from the linked list and initialises the linked list.
        !            38: */
        !            39: void output_compiler_stub()
        !            40: {
        !            41:   char tmp_buf[256];
        !            42:   char label_buf[256];
        !            43:   char *label;
        !            44:   tree tmp_stub, stub;
        !            45:   
        !            46:   for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
        !            47:     {
        !            48:       fprintf (asm_out_file, "%s:\n", IDENTIFIER_POINTER(STUB_LABEL_NAME(stub)));
        !            49: #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
        !            50:       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
        !            51:        fprintf(asm_out_file, "\t.stabd 68,0,%d\n", STUB_LINE_NUMBER (stub));
        !            52: #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
        !            53: 
        !            54: #ifdef ASM_GENERATE_LABELREF
        !            55:       ASM_GENERATE_LABELREF (label_buf, 
        !            56:                             IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub)));
        !            57: #else
        !            58:       label_buf[0] = '_';
        !            59:       strcpy (label_buf+1, IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub)));
        !            60: #endif
        !            61: 
        !            62:       if (flag_pic == 2)
        !            63:        {
        !            64:          char *local = IDENTIFIER_POINTER (STUB_LABEL_NAME (stub));
        !            65:          label = machopic_stub_name (label_buf+1);
        !            66:          
        !            67:          if (label[0] == '*') label += 1;
        !            68: 
        !            69:          sprintf (tmp_buf, "bl L$%s,%%%%r19\n\tnop\nL$%s:", local, local);
        !            70:          output_asm_insn (tmp_buf, 0);
        !            71: 
        !            72:          output_asm_insn ("depi 0,31,2,%%r19", 0);
        !            73: 
        !            74:          sprintf (tmp_buf, "addil L`%s-L$%s,%%%%r19", label, local);
        !            75:          output_asm_insn (tmp_buf, 0);
        !            76: 
        !            77:          sprintf (tmp_buf, "ldo R`%s-L$%s(%%%%r1),%%%%r19", label, local);
        !            78:          output_asm_insn (tmp_buf, 0);
        !            79: 
        !            80:          output_asm_insn ("be,n 0(4,%%r19)", 0);
        !            81:        }
        !            82:       else
        !            83:        {
        !            84:          label = label_buf;
        !            85:          
        !            86:          strcpy (tmp_buf, "ldil L%'");
        !            87:          strcat (tmp_buf, label);
        !            88:          
        !            89:          strcat (tmp_buf, ",%%r1\n\tble,n R%'");
        !            90:          strcat (tmp_buf, label);
        !            91:          
        !            92:          strcat (tmp_buf, "(4,%%r1)");
        !            93: 
        !            94:          output_asm_insn (tmp_buf, 0);
        !            95:        }
        !            96: 
        !            97: #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
        !            98:     if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
        !            99:       fprintf(asm_out_file, "\t.stabd 68,0,%d\n", STUB_LINE_NUMBER (stub));
        !           100: #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
        !           101:   } 
        !           102:   
        !           103:   stub_list = 0;
        !           104: }
        !           105: 
        !           106: /* Following function checks in the link list whether the function name is
        !           107:    already there or not.  
        !           108: */
        !           109: int no_previous_def(function_name)
        !           110:      tree function_name;
        !           111: {
        !           112:   tree stub;
        !           113:   for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
        !           114:     {
        !           115:       if (function_name == STUB_FUNCTION_NAME (stub))
        !           116:        return 0;
        !           117:     }
        !           118:   return 1;
        !           119: }
        !           120: 
        !           121: /* Following function gets the label name from the previous definition of
        !           122:    the function
        !           123: */
        !           124: tree get_prev_label(function_name)
        !           125:      tree function_name;
        !           126: {
        !           127:   tree stub;
        !           128:   for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
        !           129:     {
        !           130:       if (function_name == STUB_FUNCTION_NAME (stub))
        !           131:        return STUB_LABEL_NAME (stub);
        !           132:     }
        !           133:   return 0;
        !           134: }
        !           135: 
        !           136: struct vararg_list
        !           137: {
        !           138:   char function_name[256];
        !           139:   char flag;
        !           140:   struct vararg_list *next_stub;
        !           141: };
        !           142: 
        !           143: struct vararg_list *startvararg, *currvararg;
        !           144: 
        !           145: /* Following function adds the function name to the linked list.
        !           146:    If function is a  variable argument function make flag = 1 else 0;
        !           147: */
        !           148: void add_vararg_func(function_name, flag)
        !           149: char *function_name;
        !           150: char flag;
        !           151: {
        !           152:   struct vararg_list *temppointer;
        !           153: 
        !           154:   if (check_duplicate_entry(function_name))
        !           155:   {
        !           156:     return;
        !           157:   }
        !           158: 
        !           159:   temppointer = (struct vararg_list *)calloc(sizeof(struct vararg_list), 1);
        !           160:   strcpy(temppointer->function_name, function_name);
        !           161:   temppointer->flag = flag;
        !           162:   if (startvararg == NULL)
        !           163:   {
        !           164:     startvararg = temppointer;
        !           165:   }
        !           166:   else
        !           167:   {
        !           168:     currvararg->next_stub = temppointer;
        !           169:   }
        !           170: 
        !           171:   currvararg  = temppointer;
        !           172:   currvararg->next_stub = NULL;
        !           173: }
        !           174: 
        !           175: /* Following function checks in the link list whether the function name is
        !           176:    already there or not for vararg functions
        !           177: */
        !           178:  int check_vararg_func(function_name)
        !           179: char *function_name;
        !           180: {
        !           181:   struct vararg_list *temppointer;
        !           182: 
        !           183:   temppointer = startvararg;
        !           184:   while (temppointer)
        !           185:   {
        !           186:    if (!strcmp(temppointer->function_name, function_name))
        !           187:    {
        !           188:       if (temppointer->flag == '1')
        !           189:          return 1;
        !           190:       else
        !           191:          return 0;
        !           192:    }
        !           193:     temppointer = temppointer->next_stub;
        !           194:   }
        !           195:   return 1;
        !           196: }
        !           197: /* Following function checks in the link list whether the function name is
        !           198:    already there or not for all functions
        !           199: */
        !           200:  int check_duplicate_entry(function_name)
        !           201: char *function_name;
        !           202: {
        !           203:   struct vararg_list *temppointer;
        !           204: 
        !           205:   temppointer = startvararg;
        !           206:   while (temppointer)
        !           207:   {
        !           208:    if (!strcmp(temppointer->function_name, function_name))
        !           209:    {
        !           210:          return 1;
        !           211:    }
        !           212:     temppointer = temppointer->next_stub;
        !           213:   }
        !           214:   return 0;
        !           215: }
        !           216: 
        !           217: add_profiler_info(insn, label_buf, line_number)
        !           218: rtx insn;
        !           219: char *label_buf;
        !           220: int line_number;
        !           221: {
        !           222:   tree labelname;
        !           223:   tree funcname;
        !           224: 
        !           225:   labelname = get_identifier(label_buf);
        !           226:   funcname = get_identifier("mcount");
        !           227:   add_compiler_stub(labelname, funcname, line_number);
        !           228: }
        !           229: 
        !           230: char*
        !           231: output_profile_call (rtx insn, rtx* operands)
        !           232: {
        !           233:   rtx label_rtx = gen_label_rtx ();
        !           234:   static char buf[256];
        !           235:   static char temp_buf[300];
        !           236:   char *the_label;
        !           237:   int i;
        !           238:   rtx prev_insn;
        !           239:   int line_number;
        !           240: 
        !           241:   ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
        !           242:                               CODE_LABEL_NUMBER (label_rtx));
        !           243: 
        !           244:   if (temp_buf[0] == '*')
        !           245:     the_label = temp_buf+1;
        !           246: 
        !           247:   else
        !           248:     the_label = temp_buf;
        !           249: 
        !           250:   strcpy(buf, "jbsr mcount,%%r2,");
        !           251:   strcat(buf, the_label);
        !           252:   output_asm_insn (buf, operands);
        !           253:   prev_insn = insn;
        !           254:   while (prev_insn && GET_CODE(prev_insn) != NOTE)
        !           255:     {
        !           256:       prev_insn = PREV_INSN (prev_insn);
        !           257:     };
        !           258:   line_number = prev_insn ? NOTE_LINE_NUMBER(prev_insn) : 0;
        !           259:   add_profiler_info(insn, the_label, line_number);
        !           260:   return "ldo %0(%%r2),%%r25";
        !           261: }
        !           262: 
        !           263: void
        !           264: machopic_output_stub (file, symb, stub)
        !           265:      FILE *file;
        !           266:      const char *symb, *stub;
        !           267: {
        !           268:   static int label = 0;
        !           269:   label += 1;
        !           270: 
        !           271:   if (MACHOPIC_PURE)
        !           272:     machopic_picsymbol_stub_section ();
        !           273:   else
        !           274:     machopic_symbol_stub_section ();
        !           275: 
        !           276:   fprintf (file, "%s:\n", stub);
        !           277:   fprintf (file, "\t.indirect_symbol %s\n", symb);
        !           278: 
        !           279:   if (MACHOPIC_PURE)
        !           280:     {
        !           281:       fprintf (file, "\taddil L`L%s$lazy_ptr-%s,%%r19\n", symb, stub);
        !           282:       fprintf (file, "\tldw R`L%s$lazy_ptr-%s(%%r1),%%r19\n", symb, stub);
        !           283:       fprintf (file, "\tbe,n 0(4,%%r19)\n");
        !           284:     }
        !           285:   else
        !           286:     {
        !           287:       fprintf (file, "\tjmp *L%s$lazy_ptr\n", symb);
        !           288:     }
        !           289:   
        !           290:   fprintf (file, "%s_binder:\n", stub);
        !           291:   
        !           292:   if (MACHOPIC_PURE)
        !           293:     {
        !           294:       char *binder = machopic_non_lazy_ptr_name ("*dyld_stub_binding_helper");
        !           295:       if (binder[0] == '*') binder += 1;
        !           296:       fprintf (file, "\taddil L`L%s$lazy_ptr-%s_binder,%%r19\n", symb, stub);
        !           297:       fprintf (file, "\tldo R`L%s$lazy_ptr-%s_binder(%%r1),%%r31\n", symb, stub);
        !           298:       fprintf (file, "\taddil L`%s-%s_binder,%%r19\n", binder, stub);
        !           299:       fprintf (file, "\tldw R`%s-%s_binder(%%r1),%%r19\n", binder, stub);
        !           300:       fprintf (file, "\tbe,n 0(4,%%r19)\n");
        !           301:     }
        !           302:   else
        !           303:     {
        !           304:       fprintf (file, "\t pushl $L%s$lazy_ptr\n", symb);
        !           305:       fprintf (file, "\tjmp dyld_stub_binding_helper\n");
        !           306:     }
        !           307: 
        !           308: 
        !           309:   machopic_lazy_symbol_ptr_section ();
        !           310:   fprintf (file, "L%s$lazy_ptr:\n", symb);
        !           311:   fprintf (file, "\t.indirect_symbol %s\n", symb);
        !           312:   fprintf (file, "\t.long %s_binder\n", stub);
        !           313: }
        !           314: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.