/* Be careful, this file includes data *declarations*. */
#include "opcode/hppa.h"
+#if defined (OBJ_ELF) && defined (OBJ_SOM)
+error only one of OBJ_ELF and OBJ_SOM can be defined
+#endif
+
/* A "convient" place to put object file dependencies which do
not need to be seen outside of tc-hppa.c. */
#ifdef OBJ_ELF
-/* Names of various debugging spaces/subspaces. */
-#define GDB_DEBUG_SPACE_NAME ".stab"
-#define GDB_STRINGS_SUBSPACE_NAME ".stabstr"
-#define GDB_SYMBOLS_SUBSPACE_NAME ".stab"
-#define UNWIND_SECTION_NAME ".PARISC.unwind"
-/* Nonzero if CODE is a fixup code needing further processing. */
-
/* Object file formats specify relocation types. */
typedef elf32_hppa_reloc_type reloc_type;
to store a copyright string. */
#define obj_version obj_elf_version
#define obj_copyright obj_elf_version
-
-/* Use space aliases. */
-#define USE_ALIASES 1
#endif
#ifdef OBJ_SOM
#define obj_version obj_som_version
#define obj_copyright obj_som_copyright
-/* Do not use space aliases. */
-#define USE_ALIASES 0
-
/* How to generate a relocation. */
#define hppa_gen_reloc_type hppa_som_gen_reloc_type
unsigned int arg_count;
};
+#ifdef OBJ_SOM
/* This structure defines an entry in the subspace dictionary
chain. */
typedef struct space_dictionary_chain sd_chain_struct;
-/* Structure for previous label tracking. Needed so that alignments,
- callinfo declarations, etc can be easily attached to a particular
- label. */
-typedef struct label_symbol_struct
- {
- symbolS *lss_label;
- sd_chain_struct *lss_space;
- struct label_symbol_struct *lss_next;
- }
-label_symbol_struct;
-
/* This structure defines attributes of the default subspace
dictionary entries. */
/* An index into the default spaces array. */
int def_space_index;
- /* An alias for this section (or NULL if no alias exists). */
- char *alias;
-
/* Subsegment associated with this subspace. */
subsegT subsegment;
};
/* Segment associated with this space. */
asection *segment;
-
- /* An alias for this section (or NULL if no alias exists). */
- char *alias;
};
+#endif
+
+/* Structure for previous label tracking. Needed so that alignments,
+ callinfo declarations, etc can be easily attached to a particular
+ label. */
+typedef struct label_symbol_struct
+ {
+ struct symbol *lss_label;
+#ifdef OBJ_SOM
+ sd_chain_struct *lss_space;
+#endif
+#ifdef OBJ_ELF
+ segT lss_segment;
+#endif
+ struct label_symbol_struct *lss_next;
+ }
+label_symbol_struct;
/* Extra information needed to perform fixups (relocations) on the PA. */
struct hppa_fix_struct
/* Prototypes for functions local to tc-hppa.c. */
+#ifdef OBJ_SOM
static void pa_check_current_space_and_subspace PARAMS ((void));
+#endif
+
static fp_operand_format pa_parse_fp_format PARAMS ((char **s));
static void pa_cons PARAMS ((int));
static void pa_data PARAMS ((int));
static int pa_parse_neg_cmpsub_cmpltr PARAMS ((char **, int));
static int pa_parse_neg_add_cmpltr PARAMS ((char **, int));
static int pa_parse_nonneg_add_cmpltr PARAMS ((char **, int));
-static void pa_align PARAMS ((int));
static void pa_block PARAMS ((int));
static void pa_brtab PARAMS ((int));
static void pa_try PARAMS ((int));
static void pa_callinfo PARAMS ((int));
static void pa_code PARAMS ((int));
static void pa_comm PARAMS ((int));
-#ifdef OBJ_SOM
-static void pa_compiler PARAMS ((int));
-#endif
static void pa_copyright PARAMS ((int));
static void pa_end PARAMS ((int));
static void pa_enter PARAMS ((int));
static void pa_origin PARAMS ((int));
static void pa_proc PARAMS ((int));
static void pa_procend PARAMS ((int));
-static void pa_space PARAMS ((int));
-static void pa_spnum PARAMS ((int));
-static void pa_subspace PARAMS ((int));
static void pa_param PARAMS ((int));
static void pa_undefine_label PARAMS ((void));
static int need_pa11_opcode PARAMS ((struct pa_it *,
struct pa_11_fp_reg_struct *));
static int pa_parse_number PARAMS ((char **, struct pa_11_fp_reg_struct *));
static label_symbol_struct *pa_get_label PARAMS ((void));
+#ifdef OBJ_SOM
+static void pa_compiler PARAMS ((int));
+static void pa_align PARAMS ((int));
+static void pa_space PARAMS ((int));
+static void pa_spnum PARAMS ((int));
+static void pa_subspace PARAMS ((int));
static sd_chain_struct *create_new_space PARAMS ((char *, int, int,
int, int, int,
asection *, int));
subsegT));
static sd_chain_struct *pa_find_space_by_number PARAMS ((int));
static unsigned int pa_subspace_start PARAMS ((sd_chain_struct *, int));
+static sd_chain_struct *pa_parse_space_stmt PARAMS ((char *, int));
+static int pa_next_subseg PARAMS ((sd_chain_struct *));
+static void pa_spaces_begin PARAMS ((void));
+#endif
static void pa_ip PARAMS ((char *));
static void fix_new_hppa PARAMS ((fragS *, int, int, symbolS *,
long, expressionS *, int,
static int pa_chk_field_selector PARAMS ((char **));
static int is_same_frag PARAMS ((fragS *, fragS *));
static void process_exit PARAMS ((void));
-static sd_chain_struct *pa_parse_space_stmt PARAMS ((char *, int));
static int log2 PARAMS ((int));
-static int pa_next_subseg PARAMS ((sd_chain_struct *));
static unsigned int pa_stringer_aux PARAMS ((char *));
-static void pa_spaces_begin PARAMS ((void));
#ifdef OBJ_ELF
static void hppa_elf_mark_end_of_function PARAMS ((void));
/* File and gloally scoped variable declarations. */
+#ifdef OBJ_SOM
/* Root and final entry in the space chain. */
static sd_chain_struct *space_dict_root;
static sd_chain_struct *space_dict_last;
/* The current space and subspace. */
static sd_chain_struct *current_space;
static ssd_chain_struct *current_subspace;
+#endif
/* Root of the call_info chain. */
static struct call_info *call_info_root;
{
/* align pseudo-ops on the PA specify the actual alignment requested,
not the log2 of the requested alignment. */
+#ifdef OBJ_SOM
{"align", pa_align, 8},
+#endif
+#ifdef OBJ_ELF
+ {"align", s_align_bytes, 8},
+#endif
{"begin_brtab", pa_brtab, 1},
{"begin_try", pa_try, 1},
{"block", pa_block, 1},
{"level", pa_level, 0},
{"long", pa_cons, 4},
{"lsym", pa_lsym, 0},
+#ifdef OBJ_SOM
{"nsubspa", pa_subspace, 1},
+#endif
{"octa", pa_cons, 16},
{"org", pa_origin, 0},
{"origin", pa_origin, 0},
{"reg", pa_equ, 1},
{"short", pa_cons, 2},
{"single", pa_float_cons, 'f'},
+#ifdef OBJ_SOM
{"space", pa_space, 0},
{"spnum", pa_spnum, 0},
+#endif
{"string", pa_stringer, 0},
{"stringz", pa_stringer, 1},
+#ifdef OBJ_SOM
{"subspa", pa_subspace, 0},
+#endif
{"text", pa_text, 0},
{"version", pa_version, 0},
{"word", pa_cons, 4},
{"t", e_tsel},
};
+#ifdef OBJ_SOM
/* default space and subspace dictionaries */
#define GDB_SYMBOLS GDB_SYMBOLS_SUBSPACE_NAME
static struct default_subspace_dict pa_def_subspaces[] =
{
- {"$CODE$", 1, 1, 1, 0, 0, 0, 24, 0x2c, 0, 8, 0, 0, ".text", SUBSEG_CODE},
- {"$DATA$", 1, 1, 0, 0, 0, 0, 24, 0x1f, 1, 8, 1, 1, ".data", SUBSEG_DATA},
- {"$LIT$", 1, 1, 0, 0, 0, 0, 16, 0x2c, 0, 8, 0, 0, ".text", SUBSEG_LIT},
- {"$MILLICODE$", 1, 1, 0, 0, 0, 0, 8, 0x2c, 0, 8, 0, 0, ".text", SUBSEG_MILLI},
- {"$BSS$", 1, 1, 0, 0, 0, 1, 80, 0x1f, 1, 8, 1, 1, ".bss", SUBSEG_BSS},
-#ifdef OBJ_ELF
- {"$UNWIND$", 1, 1, 0, 0, 0, 0, 64, 0x2c, 0, 4, 0, 0, ".PARISC.unwind", SUBSEG_UNWIND},
-#endif
+ {"$CODE$", 1, 1, 1, 0, 0, 0, 24, 0x2c, 0, 8, 0, 0, SUBSEG_CODE},
+ {"$DATA$", 1, 1, 0, 0, 0, 0, 24, 0x1f, 1, 8, 1, 1, SUBSEG_DATA},
+ {"$LIT$", 1, 1, 0, 0, 0, 0, 16, 0x2c, 0, 8, 0, 0, SUBSEG_LIT},
+ {"$MILLICODE$", 1, 1, 0, 0, 0, 0, 8, 0x2c, 0, 8, 0, 0, SUBSEG_MILLI},
+ {"$BSS$", 1, 1, 0, 0, 0, 1, 80, 0x1f, 1, 8, 1, 1, SUBSEG_BSS},
{NULL, 0, 1, 0, 0, 0, 0, 255, 0x1f, 0, 4, 0, 0, 0}
};
static struct default_space_dict pa_def_spaces[] =
{
- {"$TEXT$", 0, 1, 1, 0, 8, ASEC_NULL, ".text"},
- {"$PRIVATE$", 1, 1, 1, 1, 16, ASEC_NULL, ".data"},
- {NULL, 0, 0, 0, 0, 0, ASEC_NULL, NULL}
+ {"$TEXT$", 0, 1, 1, 0, 8, ASEC_NULL},
+ {"$PRIVATE$", 1, 1, 1, 1, 16, ASEC_NULL},
+ {NULL, 0, 0, 0, 0, 0, ASEC_NULL}
};
/* Misc local definitions used by the assembler. */
-/* Return nonzero if the string pointed to by S potentially represents
- a right or left half of a FP register */
-#define IS_R_SELECT(S) (*(S) == 'R' || *(S) == 'r')
-#define IS_L_SELECT(S) (*(S) == 'L' || *(S) == 'l')
-
/* These macros are used to maintain spaces/subspaces. */
#define SPACE_DEFINED(space_chain) (space_chain)->sd_defined
#define SPACE_USER_DEFINED(space_chain) (space_chain)->sd_user_defined
#define SUBSPACE_DEFINED(ss_chain) (ss_chain)->ssd_defined
#define SUBSPACE_NAME(ss_chain) (ss_chain)->ssd_name
+#endif
+
+/* Return nonzero if the string pointed to by S potentially represents
+ a right or left half of a FP register */
+#define IS_R_SELECT(S) (*(S) == 'R' || *(S) == 'r')
+#define IS_L_SELECT(S) (*(S) == 'L' || *(S) == 'l')
/* Insert FIELD into OPCODE starting at bit START. Continue pa_ip
main loop after insertion. */
as_fatal (_("Missing .procend\n"));
}
-/* Check to make sure we have a valid space and subspace. */
-
-static void
-pa_check_current_space_and_subspace ()
-{
- if (current_space == NULL)
- as_fatal (_("Not in a space.\n"));
-
- if (current_subspace == NULL)
- as_fatal (_("Not in a subspace.\n"));
-}
-
/* Returns a pointer to the label_symbol_struct for the current space.
or NULL if no label_symbol_struct exists for the current space. */
pa_get_label ()
{
label_symbol_struct *label_chain;
- sd_chain_struct *space_chain = current_space;
for (label_chain = label_symbols_rootp;
label_chain;
label_chain = label_chain->lss_next)
- if (space_chain == label_chain->lss_space && label_chain->lss_label)
+ {
+#ifdef OBJ_SOM
+ if (current_space == label_chain->lss_space && label_chain->lss_label)
+ return label_chain;
+#endif
+#ifdef OBJ_ELF
+ if (now_seg == label_chain->lss_segment && label_chain->lss_label)
return label_chain;
+#endif
+ }
return NULL;
}
symbolS *symbol;
{
label_symbol_struct *label_chain = pa_get_label ();
- sd_chain_struct *space_chain = current_space;
if (label_chain)
label_chain->lss_label = symbol;
label_chain
= (label_symbol_struct *) xmalloc (sizeof (label_symbol_struct));
label_chain->lss_label = symbol;
- label_chain->lss_space = space_chain;
+#ifdef OBJ_SOM
+ label_chain->lss_space = current_space;
+#endif
+#ifdef OBJ_ELF
+ label_chain->lss_segment = now_seg;
+#endif
label_chain->lss_next = NULL;
if (label_symbols_rootp)
{
label_symbol_struct *label_chain;
label_symbol_struct *prev_label_chain = NULL;
- sd_chain_struct *space_chain = current_space;
for (label_chain = label_symbols_rootp;
label_chain;
label_chain = label_chain->lss_next)
{
- if (space_chain == label_chain->lss_space && label_chain->lss_label)
+ if (1
+#ifdef OBJ_SOM
+ && current_space == label_chain->lss_space && label_chain->lss_label
+#endif
+#ifdef OBJ_ELF
+ && now_seg == label_chain->lss_segment && label_chain->lss_label
+#endif
+ )
{
/* Remove the label from the chain and free its memory. */
if (prev_label_chain)
flag_readonly_data_in_text = 0;
}
+#ifdef OBJ_SOM
pa_spaces_begin ();
+#endif
op_hash = hash_new ();
if (lose)
as_fatal (_("Broken assembler. No assembly attempted."));
+#ifdef OBJ_SOM
/* SOM will change text_section. To make sure we never put
anything into the old one switch to the new one now. */
subseg_set (text_section, 0);
+#endif
#ifdef OBJ_SOM
dummy_symbol = symbol_find_or_make ("L$dummy");
unsigned long opcode;
struct pa_opcode *insn;
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
/* Skip to something interesting. */
for (s = str; isupper (*s) || islower (*s) || (*s >= '0' && *s <= '3'); ++s)
relocs[n_relocs] = NULL;
#ifdef OBJ_ELF
+#if 0
switch (fixp->fx_r_type)
{
default:
}
break;
}
+#endif
#else /* OBJ_SOM */
/* Walk over reach relocation returned by the BFD backend. */
if ((fmt == 12 || fmt == 17 || fmt == 22)
&& fixP->fx_addsy
&& fixP->fx_pcrel
+#ifdef OBJ_SOM
&& !arg_reloc_stub_needed ((long) ((obj_symbol_type *)
symbol_get_bfdsym (fixP->fx_addsy))->tc_data.ap.hppa_arg_reloc,
hppa_fixP->fx_arg_reloc)
+#endif
&& (((int)(*valp) > -262144 && (int)(*valp) < 262143) && fmt != 22)
&& S_GET_SEGMENT (fixP->fx_addsy) == hppa_fixP->segment
&& !(fixP->fx_subsy
return cmpltr;
}
+#ifdef OBJ_SOM
/* Handle an alignment directive. Special so that we can update the
alignment of the subspace if necessary. */
static void
if (log2 (bytes) != -1)
record_alignment (current_subspace->ssd_seg, log2 (bytes));
}
+#endif
/* Handle a .BLOCK type pseudo-op. */
unsigned int temp_size;
unsigned int i;
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
temp_size = get_absolute_expression ();
pa_call (unused)
int unused;
{
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
pa_call_args (&last_call_desc);
demand_empty_rest_of_line ();
pa_build_unwind_subspace (call_info)
struct call_info *call_info;
{
+#if 0
char *unwind;
asection *seg, *save_seg;
subsegT subseg, save_subseg;
/* Return back to the original segment/subsegment. */
subseg_set (save_seg, save_subseg);
+#endif
}
#endif
char *name, c, *p;
int temp;
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
/* .CALLINFO must appear within a procedure definition. */
if (!within_procedure)
pa_code (unused)
int unused;
{
+#ifdef OBJ_SOM
current_space = is_defined_space ("$TEXT$");
current_subspace
= pa_subsegment_to_subspace (current_space->sd_seg, 0);
+#endif
s_text (0);
pa_undefine_label ();
}
pa_enter (unused)
int unused;
{
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
as_bad (_("The .ENTER pseudo-op is not supported"));
demand_empty_rest_of_line ();
pa_entry (unused)
int unused;
{
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
if (!within_procedure)
as_bad (_("Misplaced .entry. Ignored."));
pa_exit (unused)
int unused;
{
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
if (!within_procedure)
as_bad (_(".EXIT must appear within a procedure"));
name = input_line_pointer;
c = get_symbol_end ();
arg_reloc = pa_align_arg_reloc (temp, pa_build_arg_reloc (name));
+#ifdef OBJ_SOM
symbol->tc_data.ap.hppa_arg_reloc |= arg_reloc;
+#endif
*input_line_pointer = c;
}
/* The return value. */
name = input_line_pointer;
c = get_symbol_end ();
arg_reloc = pa_build_arg_reloc (name);
+#ifdef OBJ_SOM
symbol->tc_data.ap.hppa_arg_reloc |= arg_reloc;
+#endif
*input_line_pointer = c;
}
/* Privelege level. */
*p = c;
input_line_pointer++;
temp = atoi (input_line_pointer);
+#ifdef OBJ_SOM
symbol->tc_data.ap.hppa_priv_level = temp;
+#endif
c = get_symbol_end ();
*input_line_pointer = c;
}
pa_leave (unused)
int unused;
{
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
as_bad (_("The .LEAVE pseudo-op is not supported"));
demand_empty_rest_of_line ();
pa_origin (unused)
int unused;
{
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
s_org (0);
pa_undefine_label ();
{
struct call_info *call_info;
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
if (within_procedure)
as_fatal (_("Nested procedures"));
int unused;
{
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
/* If we are within a procedure definition, make sure we've
defined a label for the procedure; handle case where the
pa_undefine_label ();
}
+/* If VALUE is an exact power of two between zero and 2^31, then
+ return log2 (VALUE). Else return -1. */
+
+static int
+log2 (value)
+ int value;
+{
+ int shift = 0;
+
+ while ((1 << shift) != value && shift < 32)
+ shift++;
+
+ if (shift >= 32)
+ return -1;
+ else
+ return shift;
+}
+
+
+#ifdef OBJ_SOM
+/* Check to make sure we have a valid space and subspace. */
+
+static void
+pa_check_current_space_and_subspace ()
+{
+ if (current_space == NULL)
+ as_fatal (_("Not in a space.\n"));
+
+ if (current_subspace == NULL)
+ as_fatal (_("Not in a subspace.\n"));
+}
+
/* Parse the parameters to a .SPACE directive; if CREATE_FLAG is nonzero,
then create a new space entry to hold the information specified
by the parameters to the .SPACE directive. */
demand_empty_rest_of_line ();
}
-/* If VALUE is an exact power of two between zero and 2^31, then
- return log2 (VALUE). Else return -1. */
-
-static int
-log2 (value)
- int value;
-{
- int shift = 0;
-
- while ((1 << shift) != value && shift < 32)
- shift++;
-
- if (shift >= 32)
- return -1;
- else
- return shift;
-}
-
/* Handle a .SUBSPACE pseudo-op; this switches the current subspace to the
given subspace, creating the new subspace if necessary.
pa_subspace (create_new)
int create_new;
{
- char *name, *ss_name, *alias, c;
+ char *name, *ss_name, c;
char loadable, code_only, common, dup_common, zero, sort;
int i, access, space_index, alignment, quadrant, applicable, flags;
sd_chain_struct *space;
space_index = ~0;
alignment = 1;
quadrant = 0;
- alias = NULL;
space = current_space;
if (create_new)
quadrant = pa_def_subspaces[i].quadrant;
access = pa_def_subspaces[i].access;
sort = pa_def_subspaces[i].sort;
- if (USE_ALIASES && pa_def_subspaces[i].alias)
- alias = pa_def_subspaces[i].alias;
break;
}
i++;
section = subseg_force_new (ss_name, 0);
else if (ssd)
section = ssd->ssd_seg;
- else if (alias)
- section = subseg_new (alias, 0);
- else if (!alias && USE_ALIASES)
- {
- as_warn (_("Ignoring subspace decl due to ELF BFD bugs."));
- demand_empty_rest_of_line ();
- return;
- }
else
section = subseg_new (ss_name, 0);
char *name;
/* Pick the right name to use for the new section. */
- if (pa_def_spaces[i].alias && USE_ALIASES)
- name = pa_def_spaces[i].alias;
- else
- name = pa_def_spaces[i].name;
+ name = pa_def_spaces[i].name;
pa_def_spaces[i].segment = subseg_new (name, 0);
create_new_space (pa_def_spaces[i].name, pa_def_spaces[i].spnum,
/* Pick the right name for the new section and pick the right
subsegment number. */
- if (pa_def_subspaces[i].alias && USE_ALIASES)
- {
- name = pa_def_subspaces[i].alias;
- subsegment = pa_def_subspaces[i].subsegment;
- }
- else
- {
- name = pa_def_subspaces[i].name;
- subsegment = 0;
- }
+ name = pa_def_subspaces[i].name;
+ subsegment = 0;
/* Create the new section. */
segment = subseg_new (name, subsegment);
/* For SOM we want to replace the standard .text, .data, and .bss
sections with our own. We also want to set BFD flags for
all the built-in subspaces. */
- if (!strcmp (pa_def_subspaces[i].name, "$CODE$") && !USE_ALIASES)
+ if (!strcmp (pa_def_subspaces[i].name, "$CODE$"))
{
text_section = segment;
applicable = bfd_applicable_section_flags (stdoutput);
| SEC_READONLY
| SEC_HAS_CONTENTS));
}
- else if (!strcmp (pa_def_subspaces[i].name, "$DATA$") && !USE_ALIASES)
+ else if (!strcmp (pa_def_subspaces[i].name, "$DATA$"))
{
data_section = segment;
applicable = bfd_applicable_section_flags (stdoutput);
}
- else if (!strcmp (pa_def_subspaces[i].name, "$BSS$") && !USE_ALIASES)
+ else if (!strcmp (pa_def_subspaces[i].name, "$BSS$"))
{
bss_section = segment;
applicable = bfd_applicable_section_flags (stdoutput);
bfd_set_section_flags (stdoutput, segment,
applicable & SEC_ALLOC);
}
- else if (!strcmp (pa_def_subspaces[i].name, "$LIT$") && !USE_ALIASES)
+ else if (!strcmp (pa_def_subspaces[i].name, "$LIT$"))
{
applicable = bfd_applicable_section_flags (stdoutput);
bfd_set_section_flags (stdoutput, segment,
| SEC_READONLY
| SEC_HAS_CONTENTS));
}
- else if (!strcmp (pa_def_subspaces[i].name, "$MILLICODE$")
- && !USE_ALIASES)
+ else if (!strcmp (pa_def_subspaces[i].name, "$MILLICODE$"))
{
applicable = bfd_applicable_section_flags (stdoutput);
bfd_set_section_flags (stdoutput, segment,
| SEC_READONLY
| SEC_HAS_CONTENTS));
}
- else if (!strcmp (pa_def_subspaces[i].name, "$UNWIND$") && !USE_ALIASES)
+ else if (!strcmp (pa_def_subspaces[i].name, "$UNWIND$"))
{
applicable = bfd_applicable_section_flags (stdoutput);
bfd_set_section_flags (stdoutput, segment,
we'll set it to 1 which "locks-in" the subspace attributes. */
SUBSPACE_DEFINED (chain_entry) = 0;
- chain_entry->ssd_subseg = USE_ALIASES ? pa_next_subseg (space) : 0;
+ chain_entry->ssd_subseg = 0;
chain_entry->ssd_seg = seg;
chain_entry->ssd_next = NULL;
sd_chain_struct *space;
int quadrant;
{
-#ifdef OBJ_SOM
/* FIXME. Assumes everyone puts read/write data at 0x4000000, this
is not correct for the PA OSF1 port. */
if ((strcmp (SPACE_NAME (space), "$PRIVATE$") == 0) && quadrant == 1)
return 0x40000000;
else
return 0;
-#endif
return 0;
}
space->sd_last_subseg++;
return space->sd_last_subseg;
}
+#endif
/* Helper function for pa_stringer. Used to find the end of
a string. */
{
unsigned int c = *s & CHAR_MASK;
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
switch (c)
{
pa_data (unused)
int unused;
{
+#ifdef OBJ_SOM
current_space = is_defined_space ("$PRIVATE$");
current_subspace
= pa_subsegment_to_subspace (current_space->sd_seg, 0);
+#endif
s_data (0);
pa_undefine_label ();
}
pa_fill (unused)
int unused;
{
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
s_fill (0);
pa_undefine_label ();
pa_lcomm (needs_align)
int needs_align;
{
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
s_lcomm (needs_align);
pa_undefine_label ();
pa_lsym (unused)
int unused;
{
+#ifdef OBJ_SOM
/* We must have a valid space and subspace. */
pa_check_current_space_and_subspace ();
+#endif
s_lsym (0);
pa_undefine_label ();
pa_text (unused)
int unused;
{
+#ifdef OBJ_SOM
current_space = is_defined_space ("$TEXT$");
current_subspace
= pa_subsegment_to_subspace (current_space->sd_seg, 0);
+#endif
s_text (0);
pa_undefine_label ();
#define arg_reloc_stub_needed(CALLER, CALLEE) \
((CALLEE) && (CALLER) && ((CALLEE) != (CALLER)))
+#ifdef OBJ_SOM
/* It is necessary to force PC-relative calls/jumps to have a relocation
entry if they're going to need either a argument relocation or long
call stub. FIXME. Can't we need the same for absolute calls? */
symbol_get_bfdsym (fixp->fx_addsy))->tc_data.ap.hppa_arg_reloc,
hppa_fixp->fx_arg_reloc)))
return 1;
+#endif
distance = (fixp->fx_offset + S_GET_VALUE (fixp->fx_addsy)
- md_pcrel_from (fixp));
/* Now check and see if we're going to need a long-branch stub. */