* tc-m68hc11.c (s_m68hc11_parse_pseudo_instruction):
[deliverable/binutils-gdb.git] / gas / config / tc-alpha.c
index a7582d4da905d49f989017da607cf3fb198bb76c..d020896d6892014634e3b053d4ae8c273d716d7d 100644 (file)
@@ -293,8 +293,6 @@ size_t md_longopts_size = sizeof (md_longopts);
 #undef AXP_REG_GP
 #define AXP_REG_GP AXP_REG_PV
 
-static struct hash_control *alpha_evax_proc_hash;
-
 #endif /* OBJ_EVAX  */
 
 /* The cpu for which we are generating code.  */
@@ -429,6 +427,7 @@ static struct alpha_linkage_fixups *alpha_linkage_fixup_tail;
 
 /* Current procedure descriptor.  */
 static struct alpha_evax_procs *alpha_evax_proc;
+static struct alpha_evax_procs alpha_evax_proc_data;
 
 static int alpha_flag_hash_long_names = 0;             /* -+ */
 static int alpha_flag_show_after_trunc = 0;            /* -H */
@@ -1388,14 +1387,14 @@ load_expression (int targreg,
                    ptr1 = strstr (symname, "..") + 2;
                    if (ptr1 > ptr2)
                      ptr1 = symname;
-                   ensymname = (char *) xmalloc (ptr2 - ptr1 + 5);
+                   ensymname = (char *) alloca (ptr2 - ptr1 + 5);
                    memcpy (ensymname, ptr1, ptr2 - ptr1);
                    memcpy (ensymname + (ptr2 - ptr1), "..en", 5);
 
                    gas_assert (insn.nfixups + 1 <= MAX_INSN_FIXUPS);
                    insn.fixups[insn.nfixups].reloc = BFD_RELOC_ALPHA_NOP;
                    ensym = symbol_find_or_make (ensymname);
-                   ensym->sy_used = 1;
+                   symbol_mark_used (ensym);
                    /* The fixup must be the same as the BFD_RELOC_ALPHA_BOH
                       case in emit_jsrjmp.  See B.4.5.2 of the OpenVMS Linker
                       Utility Manual.  */
@@ -1420,14 +1419,14 @@ load_expression (int targreg,
                    ptr1 = strstr (symname, "..") + 2;
                    if (ptr1 > ptr2)
                      ptr1 = symname;
-                   psymname = (char *) xmalloc (ptr2 - ptr1 + 1);
+                   psymname = (char *) alloca (ptr2 - ptr1 + 1);
                    memcpy (psymname, ptr1, ptr2 - ptr1);
                    psymname [ptr2 - ptr1] = 0;
 
                    gas_assert (insn.nfixups + 1 <= MAX_INSN_FIXUPS);
                    insn.fixups[insn.nfixups].reloc = BFD_RELOC_ALPHA_LDA;
                    psym = symbol_find_or_make (psymname);
-                   psym->sy_used = 1;
+                   symbol_mark_used (psym);
                    insn.fixups[insn.nfixups].exp.X_op = O_subtract;
                    insn.fixups[insn.nfixups].exp.X_add_symbol = psym;
                    insn.fixups[insn.nfixups].exp.X_op_symbol = alpha_evax_proc->symbol;
@@ -1996,7 +1995,7 @@ insert_operand (unsigned insn,
        }
 
       if (val < min || val > max)
-       as_warn_value_out_of_range (_("operand"), val, min, max, file, line);
+       as_bad_value_out_of_range (_("operand"), val, min, max, file, line);
     }
 
   if (operand->insert)
@@ -2885,7 +2884,7 @@ emit_jsrjmp (const expressionS *tok,
       char *ensymname;
 
       /* Build the entry name as 'NAME..en'.  */
-      ensymname = (char *) xmalloc (symlen + 5);
+      ensymname = (char *) alloca (symlen + 5);
       memcpy (ensymname, symname, symlen);
       memcpy (ensymname + symlen, "..en", 5);
 
@@ -3413,19 +3412,22 @@ add_to_link_pool (symbolS *sym, offsetT addend)
   p = frag_more (8);
   memset (p, 0, 8);
 
-  /* Create the basesym - linksym expression (offset of the added entry).  */
+  /* Create a symbol for 'basesym - linksym' (offset of the added entry).  */
   e.X_op = O_subtract;
   e.X_add_symbol = linksym;
   e.X_op_symbol = basesym;
   e.X_add_number = 0;
   expsym = make_expr_symbol (&e);
 
+  /* Create a fixup for the entry.  */
   fixp = fix_new
     (frag_now, p - frag_now->fr_literal, 8, sym, addend, 0, BFD_RELOC_64);
   fixp->tc_fix_data.info = get_alpha_reloc_tag (next_sequence_num--);
   fixp->tc_fix_data.info->sym = expsym;
 
   subseg_set (current_section, current_subsec);
+
+  /* Return the symbol.  */
   return expsym;
 }
 #endif /* OBJ_EVAX */
@@ -3600,7 +3602,7 @@ s_alpha_comm (int ignore ATTRIBUTE_UNUSED)
       frag_align (log_align, 0, 0);
       record_alignment (bss_section, log_align);
 
-      symbolP->sy_frag = frag_now;
+      symbol_set_frag (symbolP, frag_now);
       pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP,
                         size, NULL);
       *pfrag = 0;
@@ -4043,6 +4045,14 @@ alpha_elf_md_end (void)
   if (bfd_get_section_by_name (stdoutput, ".eh_frame") != NULL)
     return;
 
+  /* ??? In theory we could look for functions for which we have
+     generated unwind info via CFI directives, and those we have not.
+     Those we have not could still get their unwind info from here.
+     For now, do nothing if we've seen any CFI directives.  Note that
+     the above test will not trigger, as we've not emitted data yet.  */
+  if (all_fde_data != NULL)
+    return;
+
   /* Generate .eh_frame data for the unwind directives specified.  */
   for (p = all_frame_data; p ; p = p->next)
     if (p->prologue_sym)
@@ -4356,8 +4366,10 @@ s_alpha_ent (int ignore ATTRIBUTE_UNUSED)
   symbolS *symbol;
   expressionS symexpr;
 
-  alpha_evax_proc
-    = (struct alpha_evax_procs *) xmalloc (sizeof (struct alpha_evax_procs));
+  if (alpha_evax_proc != NULL)
+    as_bad (_("previous .ent not closed by a .end"));
+
+  alpha_evax_proc = &alpha_evax_proc_data;
 
   alpha_evax_proc->pdsckind = 0;
   alpha_evax_proc->framereg = -1;
@@ -4385,10 +4397,6 @@ s_alpha_ent (int ignore ATTRIBUTE_UNUSED)
   symbol_get_bfdsym (symbol)->flags |= BSF_FUNCTION;
   alpha_evax_proc->symbol = symbol;
 
-  (void) hash_insert
-    (alpha_evax_proc_hash,
-     symbol_get_bfdsym (alpha_evax_proc->symbol)->name, (PTR)alpha_evax_proc);
-
   demand_empty_rest_of_line ();
 }
 
@@ -4427,6 +4435,7 @@ static void
 s_alpha_frame (int ignore ATTRIBUTE_UNUSED)
 {
   long val;
+  int ra;
 
   alpha_evax_proc->framereg = tc_get_register (1);
 
@@ -4442,7 +4451,10 @@ s_alpha_frame (int ignore ATTRIBUTE_UNUSED)
 
   alpha_evax_proc->framesize = val;
 
-  (void) tc_get_register (1);
+  ra = tc_get_register (1);
+  if (ra != AXP_REG_RA)
+    as_warn (_("Bad RA (%d) register for .frame"), ra);
+
   SKIP_WHITESPACE ();
   if (*input_line_pointer++ != ',')
     {
@@ -4459,13 +4471,12 @@ s_alpha_frame (int ignore ATTRIBUTE_UNUSED)
 static void
 s_alpha_prologue (int ignore ATTRIBUTE_UNUSED)
 {
-  get_absolute_expression ();
   demand_empty_rest_of_line ();
   alpha_prologue_label = symbol_new
     (FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (), frag_now);
 }
 
-/* Parse .pdesc <entry_name>.
+/* Parse .pdesc <entry_name>,{null|stack|reg}
    Insert a procedure descriptor.  */
 
 static void
@@ -4476,48 +4487,48 @@ s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
   register char *p;
   expressionS exp;
   symbolS *entry_sym;
-  fixS *fixp;
-  segment_info_type *seginfo = seg_info (alpha_link_section);
   const char *entry_sym_name;
-  char *sym_name;
-  int len;
+  const char *pdesc_sym_name;
+  fixS *fixp;
+  size_t len;
 
   if (now_seg != alpha_link_section)
     {
       as_bad (_(".pdesc directive not in link (.link) section"));
-      demand_empty_rest_of_line ();
       return;
     }
 
   expression (&exp);
   if (exp.X_op != O_symbol)
     {
-      as_warn (_(".pdesc directive has no entry symbol"));
-      demand_empty_rest_of_line ();
+      as_bad (_(".pdesc directive has no entry symbol"));
       return;
     }
   
   entry_sym = make_expr_symbol (&exp);
-  entry_sym_name = symbol_get_bfdsym (entry_sym)->name;
+  entry_sym_name = S_GET_NAME (entry_sym);
  
   /* Strip "..en".  */
   len = strlen (entry_sym_name);
-  sym_name = (char *) xmalloc (len - 4 + 1);
-  strncpy (sym_name, entry_sym_name, len - 4);
-  sym_name [len - 4] = 0;
-  
-  alpha_evax_proc = (struct alpha_evax_procs *)
-    hash_find (alpha_evax_proc_hash, sym_name);
-  if (!alpha_evax_proc || !S_IS_DEFINED (alpha_evax_proc->symbol))
+  if (len < 4 || strcmp (entry_sym_name + len - 4, "..en") != 0)
     {
-      as_fatal (_(".pdesc has no matching .ent"));
-      demand_empty_rest_of_line ();
+      as_bad (_(".pdesc has a bad entry symbol"));
+      return;
+    }
+  len -= 4;
+  pdesc_sym_name = S_GET_NAME (alpha_evax_proc->symbol);
+
+  if (!alpha_evax_proc
+      || !S_IS_DEFINED (alpha_evax_proc->symbol)
+      || strlen (pdesc_sym_name) != len
+      || memcmp (entry_sym_name, pdesc_sym_name, len) != 0)
+    {
+      as_fatal (_(".pdesc doesn't match with last .ent"));
       return;
     }
 
   /* Define pdesc symbol.  */
-  define_sym_at_dot (alpha_evax_proc->symbol);
+  symbol_set_value_now (alpha_evax_proc->symbol);
  
   /* Save bfd symbol of proc entry in function symbol.  */
   ((struct evax_private_udata_struct *)
@@ -4593,19 +4604,15 @@ s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
   /* Signature offset.  */
   md_number_to_chars (p + 6, (valueT) 0, 2);
 
-  fix_new_exp (frag_now, p - frag_now->fr_literal+8, 8, &exp, 0, BFD_RELOC_64);
+  fix_new_exp (frag_now, p - frag_now->fr_literal + 8,
+               8, &exp, 0, BFD_RELOC_64);
 
   if (alpha_evax_proc->pdsckind == PDSC_S_K_KIND_NULL)
     return;
 
-  /* Add dummy fix to make add_to_link_pool work.  */
-  p = frag_more (6);
-  fixp = fix_new (frag_now, p - frag_now->fr_literal, 6, 0, 0, 0, 0);
-  fixp->fx_done = 1;
-  
   /* pdesc+16: Size.  */
+  p = frag_more (6);
   md_number_to_chars (p, (valueT) alpha_evax_proc->framesize, 4);
-
   md_number_to_chars (p + 4, (valueT) 0, 2);
 
   /* Entry length.  */
@@ -4617,13 +4624,8 @@ s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
   if (alpha_evax_proc->pdsckind == PDSC_S_K_KIND_FP_REGISTER)
     return;
 
-  /* Add dummy fix to make add_to_link_pool work.  */
-  p = frag_more (8);
-  fixp = fix_new (frag_now, p - frag_now->fr_literal, 8, 0, 0, 0, 0);
-  fixp->fx_done = 1;
-
   /* pdesc+24: register masks.  */
-
+  p = frag_more (8);
   md_number_to_chars (p, alpha_evax_proc->imask, 4);
   md_number_to_chars (p + 4, alpha_evax_proc->fmask, 4);
 
@@ -4636,10 +4638,7 @@ s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
 
   if (alpha_evax_proc->handler_data)
     {
-      /* Add dummy fix to make add_to_link_pool work.  */
       p = frag_more (8);
-      fixp = fix_new (frag_now, p - frag_now->fr_literal, 8, 0, 0, 0, 0);
-      fixp->fx_done = 1;
       md_number_to_chars (p, alpha_evax_proc->handler_data, 8);
     }
 }
@@ -4651,7 +4650,6 @@ s_alpha_name (int ignore ATTRIBUTE_UNUSED)
 {
   char *p;
   expressionS exp;
-  segment_info_type *seginfo = seg_info (alpha_link_section);
 
   if (now_seg != alpha_link_section)
     {
@@ -4706,31 +4704,26 @@ s_alpha_linkage (int ignore ATTRIBUTE_UNUSED)
       p = frag_more (LKP_S_K_SIZE);
       memset (p, 0, LKP_S_K_SIZE);
       fixp = fix_new_exp
-       (frag_now, p - frag_now->fr_literal, LKP_S_K_SIZE, &exp, 0,\
+       (frag_now, p - frag_now->fr_literal, LKP_S_K_SIZE, &exp, 0,
         BFD_RELOC_ALPHA_LINKAGE);
 
+      if (alpha_insn_label == NULL)
+       alpha_insn_label = symbol_new
+         (FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (), frag_now);
+
+      /* Create a linkage element.  */
       linkage_fixup = (struct alpha_linkage_fixups *)
        xmalloc (sizeof (struct alpha_linkage_fixups));
-
       linkage_fixup->fixp = fixp;
-      linkage_fixup->next = 0;
-
-      if (alpha_insn_label == 0)
-       alpha_insn_label = symbol_new
-         (FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (), frag_now);
+      linkage_fixup->next = NULL;
       linkage_fixup->label = alpha_insn_label;
 
-      if (alpha_linkage_fixup_root == 0)
-       {
-         alpha_linkage_fixup_root = alpha_linkage_fixup_tail = linkage_fixup;
-         alpha_linkage_fixup_tail->next = 0;
-       }
+      /* Append it to the list.  */
+      if (alpha_linkage_fixup_root == NULL)
+        alpha_linkage_fixup_root = linkage_fixup;
       else
-       {
-         alpha_linkage_fixup_tail->next = linkage_fixup;
-         alpha_linkage_fixup_tail = linkage_fixup;
-         alpha_linkage_fixup_tail->next = 0;
-       }
+        alpha_linkage_fixup_tail->next = linkage_fixup;
+      alpha_linkage_fixup_tail = linkage_fixup;
     }
   demand_empty_rest_of_line ();
 }
@@ -4764,7 +4757,6 @@ s_alpha_code_address (int ignore ATTRIBUTE_UNUSED)
 static void
 s_alpha_fp_save (int ignore ATTRIBUTE_UNUSED)
 {
-
   alpha_evax_proc->fp_save = tc_get_register (1);
 
   demand_empty_rest_of_line ();
@@ -5310,7 +5302,7 @@ maybe_set_gp (asection *sec)
 
   if (!sec)
     return;
-  vma = bfd_get_section_vma (foo, sec);
+  vma = bfd_get_section_vma (sec->owner, sec);
   if (vma && vma < alpha_gp_value)
     alpha_gp_value = vma;
 }
@@ -5518,7 +5510,6 @@ md_begin (void)
 
 #ifdef OBJ_EVAX
   create_literal_section (".link", &alpha_link_section, &alpha_link_symbol);
-  alpha_evax_proc_hash = hash_new ();
 #endif
 
 #ifdef OBJ_ELF
@@ -6287,11 +6278,14 @@ tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED,
       if (pname_len > 4 && strcmp (pname + pname_len - 4, "..en") == 0)
        {
          symbolS *sym;
-         char *my_pname = xstrdup (pname);
+         char *my_pname = (char *) alloca (pname_len - 4 + 1);
+
+         memcpy (my_pname, pname, pname_len - 4);
          my_pname [pname_len - 4] = 0;
          sym = symbol_find (my_pname);
          if (sym == NULL)
            abort ();
+
          while (symbol_equated_reloc_p (sym))
            {
              symbolS *n = symbol_get_value_expression (sym)->X_add_symbol;
This page took 0.028859 seconds and 4 git commands to generate.