home *** CD-ROM | disk | FTP | other *** search
/ OpenStep (Enterprise) / OpenStepENTCD.toast / OEDEV / GNUSRC.Z / next.c < prev    next >
C/C++ Source or Header  |  1996-06-12  |  3KB  |  110 lines

  1. /* next.c:  Functions for NeXT as target machine for GNU C compiler.  */
  2.  
  3. /* Note that the include below means that we can't debug routines in
  4.    i386.c when running on a COFF system.  */
  5.  
  6. #include "i386/i386.c"
  7. #include "next/nextstep.c"
  8.  
  9. void
  10. machopic_output_stub (file, symb, stub)
  11.      FILE *file;
  12.      const char *symb, *stub;
  13. {
  14.   unsigned int length;
  15.   char *binder_name, *symbol_name, *lazy_ptr_name;
  16.   static int label = 0;
  17.   label += 1;
  18.  
  19.   length = strlen(stub);
  20.   binder_name = alloca(length + 32);
  21.   GEN_BINDER_NAME_FOR_STUB(binder_name, stub, length);
  22.  
  23.   length = strlen(symb);
  24.   symbol_name = alloca(length + 32);
  25.   GEN_SYMBOL_NAME_FOR_SYMBOL(symbol_name, symb, length);
  26.  
  27.   lazy_ptr_name = alloca(length + 32);
  28.   GEN_LAZY_PTR_NAME_FOR_SYMBOL(lazy_ptr_name, symb, length);
  29.  
  30.   if (MACHOPIC_PURE)
  31.     machopic_picsymbol_stub_section ();
  32.   else
  33.     machopic_symbol_stub_section ();
  34.  
  35.   fprintf (file, "%s:\n", stub);
  36.   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
  37.  
  38.   if (MACHOPIC_PURE)
  39.     {
  40.       fprintf (file, "\tcall LPC$%d\nLPC$%d:\tpopl %%eax\n", label, label);
  41.       fprintf (file, "\tmovl %s-LPC$%d(%%eax),%%edx\n", lazy_ptr_name, label);
  42.       fprintf (file, "\tjmp %%edx\n");
  43.     }
  44.   else
  45.     {
  46.       fprintf (file, "\tjmp *%s\n", lazy_ptr_name);
  47.     }
  48.   
  49.   fprintf (file, "%s:\n", binder_name);
  50.   
  51.   if (MACHOPIC_PURE)
  52.     {
  53.       fprintf (file, "\tlea %s-LPC$%d(%%eax),%%eax\n", lazy_ptr_name, label);
  54.       fprintf (file, "\tpushl %%eax\n");
  55.     }
  56.   else
  57.     {
  58.       fprintf (file, "\t pushl $%s\n", lazy_ptr_name);
  59.     }
  60.  
  61.   fprintf (file, "\tjmp dyld_stub_binding_helper\n");
  62.  
  63.   machopic_lazy_symbol_ptr_section ();
  64.   fprintf (file, "%s:\n", lazy_ptr_name);
  65.   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
  66.   fprintf (file, "\t.long %s\n", binder_name);
  67. }
  68.  
  69. i386_finalize_machopic()
  70. {
  71.     extern int          current_function_uses_pic_offset_table;
  72.     int const_double = const_double_used();
  73.  
  74.     if (PIC_OFFSET_TABLE_REGNUM >= FIRST_PSEUDO_REGISTER
  75.     && regno_reg_rtx [PIC_OFFSET_TABLE_REGNUM])
  76.       pic_offset_table_rtx = regno_reg_rtx [PIC_OFFSET_TABLE_REGNUM];
  77.  
  78.     if (!current_function_uses_pic_offset_table) 
  79.       {
  80.     current_function_uses_pic_offset_table =
  81.       profile_flag
  82.         | profile_block_flag
  83.           | get_pool_size()
  84.         | current_function_uses_const_pool
  85.           | const_double_used ();
  86.     
  87.     if (current_function_uses_pic_offset_table) {
  88.       rtx first_insn = next_real_insn (get_insns());
  89.  
  90.       if (!first_insn)
  91.         return;
  92.  
  93.       emit_insn_before(gen_rtx(SET, VOIDmode,
  94.                    pic_offset_table_rtx,
  95.                    gen_rtx(PC, VOIDmode)),
  96.                first_insn);
  97.       
  98.       emit_insn_after(gen_rtx(USE, VOIDmode,
  99.                   pic_offset_table_rtx),
  100.               get_last_insn());
  101.     }
  102.       }
  103.     else if (const_double)
  104.       {
  105.       emit_insn_after(gen_rtx(USE, VOIDmode,
  106.                   pic_offset_table_rtx),
  107.               get_last_insn());
  108.       }
  109. }
  110.