include/elf/
[deliverable/binutils-gdb.git] / gas / config / tc-hppa.c
index c5df9ca614178403f6e819d155e8b977e0c0dea8..9db438f5798960c9ca586db40ee8f16661700ca7 100644 (file)
@@ -1,6 +1,6 @@
 /* tc-hppa.c -- Assemble for the PA
-   Copyright 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-   Free Software Foundation, Inc.
+   Copyright 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+   2002 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -57,8 +57,10 @@ typedef elf_symbol_type obj_symbol_type;
 #if TARGET_ARCH_SIZE == 64
 /* How to generate a relocation.  */
 #define hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
+#define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
 #else
 #define hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
+#define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
 #endif
 
 /* ELF objects can have versions, but apparently do not have anywhere
@@ -1287,10 +1289,10 @@ pa_undefine_label ()
     {
       if (1
 #ifdef OBJ_SOM
-         && current_space == label_chain->lss_space && label_chain->lss_label
+         && current_space == label_chain->lss_space && label_chain->lss_label
 #endif
 #ifdef OBJ_ELF
-         && now_seg == label_chain->lss_segment && label_chain->lss_label
+         && now_seg == label_chain->lss_segment && label_chain->lss_label
 #endif
          )
        {
@@ -1810,6 +1812,7 @@ pa_ip (str)
                {
 
                /* Handle a completer for an indexing load or store.  */
+               case 'X':
                case 'x':
                  {
                    int uu = 0;
@@ -1848,6 +1851,7 @@ pa_ip (str)
                  }
 
                /* Handle a short load/store completer.  */
+               case 'M':
                case 'm':
                case 'q':
                case 'J':
@@ -1887,9 +1891,9 @@ pa_ip (str)
                    else if (*args == 'e')
                      break;
 
-                  /* 'J', 'm' and 'q' are the same, except for where they
+                  /* 'J', 'm', 'M' and 'q' are the same, except for where they
                       encode the before/after field.  */
-                  if (*args == 'm')
+                  if (*args == 'm' || *args == 'M')
                      {
                        opcode |= m << 5;
                        INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
@@ -1915,6 +1919,7 @@ pa_ip (str)
                  }
 
                /* Handle a stbys completer.  */
+               case 'A':
                case 's':
                  {
                    int a = 0;
@@ -2329,16 +2334,16 @@ pa_ip (str)
                args++;
                switch (*args)
                  {
-                 /* Handle FP compare conditions.  */
-                 case 'f':
-                   cond = pa_parse_fp_cmp_cond (&s);
-                   INSERT_FIELD_AND_CONTINUE (opcode, cond, 0);
+                 /* Handle FP compare conditions.  */
+                 case 'f':
+                   cond = pa_parse_fp_cmp_cond (&s);
+                   INSERT_FIELD_AND_CONTINUE (opcode, cond, 0);
 
                  /* Handle an add condition.  */
                  case 'A':
                  case 'a':
-                   cmpltr = 0;
-                   flag = 0;
+                   cmpltr = 0;
+                   flag = 0;
                    if (*s == ',')
                      {
                        s++;
@@ -4235,8 +4240,8 @@ tc_gen_reloc (section, fixp)
        case R_N0SEL:
        case R_N1SEL:
          /* There is no symbol or addend associated with these fixups.  */
-          relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
-          *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
+         relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
+         *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
          relocs[i]->addend = 0;
          break;
 
@@ -4244,8 +4249,8 @@ tc_gen_reloc (section, fixp)
        case R_ENTRY:
        case R_EXIT:
          /* There is no symbol associated with these fixups.  */
-          relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
-          *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
+         relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
+         *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
          relocs[i]->addend = fixp->fx_offset;
          break;
 
@@ -4406,7 +4411,7 @@ md_undefined_symbol (name)
 void
 md_apply_fix3 (fixP, valP, seg)
      fixS *fixP;
-     valueT *valp;
+     valueT *valP;
      segT seg ATTRIBUTE_UNUSED;
 {
   unsigned char *buf;
@@ -4454,7 +4459,7 @@ md_apply_fix3 (fixP, valP, seg)
       return;
     }
 
-  buf = fixP->fx_frag->fr_literal + fixP->fx_where;
+  buf = (unsigned char *) (fixP->fx_frag->fr_literal + fixP->fx_where);
   insn = bfd_get_32 (stdoutput, buf);
   fmt = bfd_hppa_insn2fmt (stdoutput, insn);
 
@@ -5222,7 +5227,7 @@ pa_get_absolute_expression (insn, strp)
       input_line_pointer = *strp;
       s = *strp;
       while (*s != ',' && *s != ' ' && *s != '\t')
-        s++;
+       s++;
 
       c = *s;
       *s = 0;
@@ -8370,6 +8375,7 @@ int
 hppa_fix_adjustable (fixp)
      fixS *fixp;
 {
+  reloc_type code;
   struct hppa_fix_struct *hppa_fix;
 
   hppa_fix = (struct hppa_fix_struct *) fixp->tc_fix_data;
@@ -8381,9 +8387,43 @@ hppa_fix_adjustable (fixp)
 #endif
 
 #ifdef OBJ_ELF
-  if (fixp->fx_r_type == (int) R_PARISC_GNU_VTINHERIT
-      || fixp->fx_r_type ==  (int) R_PARISC_GNU_VTENTRY)
-    return 0;
+  /* LR/RR selectors are implicitly used for a number of different relocation
+     types.  We must ensure that none of these types are adjusted (see below)
+     even if they occur with a different selector.  */
+  code = elf_hppa_reloc_final_type (stdoutput, fixp->fx_r_type,
+                                   hppa_fix->fx_r_format,
+                                   hppa_fix->fx_r_field);
+
+  switch (code)
+    {
+    /* Relocation types which use e_lrsel.  */
+    case R_PARISC_DIR21L:
+    case R_PARISC_DLTREL21L:
+    case R_PARISC_DPREL21L:
+    case R_PARISC_PLTOFF21L:
+
+    /* Relocation types which use e_rrsel.  */
+    case R_PARISC_DIR14R:
+    case R_PARISC_DIR14DR:
+    case R_PARISC_DIR14WR:
+    case R_PARISC_DIR17R:
+    case R_PARISC_DLTREL14R:
+    case R_PARISC_DLTREL14DR:
+    case R_PARISC_DLTREL14WR:
+    case R_PARISC_DPREL14R:
+    case R_PARISC_DPREL14DR:
+    case R_PARISC_DPREL14WR:
+    case R_PARISC_PLTOFF14R:
+    case R_PARISC_PLTOFF14DR:
+    case R_PARISC_PLTOFF14WR:
+
+    /* Other types that we reject for reduction.  */
+    case R_PARISC_GNU_VTENTRY:
+    case R_PARISC_GNU_VTINHERIT:
+      return 0;
+    default:
+      break;
+    }
 #endif
 
   if (fixp->fx_addsy && (S_IS_EXTERNAL (fixp->fx_addsy)
This page took 0.026319 seconds and 4 git commands to generate.