From 49863f82f0726f95d341c35001794e12659d39f7 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Fri, 18 Jun 1999 13:35:16 +0000 Subject: [PATCH] * tc-hppa.c: General cleanups of ELF support. No more spaces and subspaces for ELF. (GDB_DEBUG_SPACE_NAME): Delete definition for ELF. (GDB_STRINGS_SUBSPACE_NAME): Likewise. (GDB_SYMBOLS_SUBSPACE_NAME): Likewise (UNWIND_SECTION_NAME): Likewise. (space/subspace related structures): Conditionalize definitions on OBJ_SOM. (space/subspace directives and support routines): Conditionalize definitions and references/uses on OBJ_SOM. (label_symbol_struct): For ELF, track the symbol's segment. For SOM track its space. (pa_define_label, pa_undefine_label, pa_get_label): Corresponding changes. (USE_ALIASES): Kill for both SOM & ELF. (pa_def_subspaces, pa_def_spaces): Corresponding changes. (pa_space, pa_subspace): Corresponding changes. (pa_spaces_begin): Corresponding chagnes. (md_begin): Do not muck around with space/subspace stuff for OBJ_ELF. (md_apply_fix): Temporarily disable argument relocation stuff for OBJ_ELF. (tc_gen_reloc): Temporarily disable relocation generation for OBJ_ELF (pa_build_unwind_subspace): Similarly. --- gas/ChangeLog | 28 ++++ gas/config/tc-hppa.c | 314 +++++++++++++++++++++++++------------------ 2 files changed, 214 insertions(+), 128 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 708e1a77af..d82f041137 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,31 @@ +Fri Jun 18 14:34:18 1999 Jeffrey A Law (law@cygnus.com) + + * tc-hppa.c: General cleanups of ELF support. No more spaces + and subspaces for ELF. + (GDB_DEBUG_SPACE_NAME): Delete definition for ELF. + (GDB_STRINGS_SUBSPACE_NAME): Likewise. + (GDB_SYMBOLS_SUBSPACE_NAME): Likewise + (UNWIND_SECTION_NAME): Likewise. + (space/subspace related structures): Conditionalize definitions + on OBJ_SOM. + (space/subspace directives and support routines): Conditionalize + definitions and references/uses on OBJ_SOM. + (label_symbol_struct): For ELF, track the symbol's segment. For + SOM track its space. + (pa_define_label, pa_undefine_label, pa_get_label): Corresponding + changes. + (USE_ALIASES): Kill for both SOM & ELF. + (pa_def_subspaces, pa_def_spaces): Corresponding changes. + (pa_space, pa_subspace): Corresponding changes. + (pa_spaces_begin): Corresponding chagnes. + (md_begin): Do not muck around with space/subspace stuff for + OBJ_ELF. + (md_apply_fix): Temporarily disable argument relocation stuff + for OBJ_ELF. + (tc_gen_reloc): Temporarily disable relocation generation for + OBJ_ELF + (pa_build_unwind_subspace): Similarly. + 1999-06-16 Nick Clifton * config/tc-arm.c (thumb_set): New pseudo op. diff --git a/gas/config/tc-hppa.c b/gas/config/tc-hppa.c index c2431d9ca4..61083d462d 100644 --- a/gas/config/tc-hppa.c +++ b/gas/config/tc-hppa.c @@ -35,16 +35,13 @@ /* 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; @@ -58,9 +55,6 @@ typedef elf_symbol_type obj_symbol_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 @@ -77,9 +71,6 @@ typedef int reloc_type; #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 @@ -268,6 +259,7 @@ struct call_desc unsigned int arg_count; }; +#ifdef OBJ_SOM /* This structure defines an entry in the subspace dictionary chain. */ @@ -322,17 +314,6 @@ struct space_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. */ @@ -379,9 +360,6 @@ struct default_subspace_dict /* 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; }; @@ -412,10 +390,24 @@ struct default_space_dict /* 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 @@ -462,7 +454,10 @@ struct selector_entry /* 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)); @@ -484,7 +479,6 @@ static int pa_parse_nonneg_cmpsub_cmpltr PARAMS ((char **, 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)); @@ -493,9 +487,6 @@ static void pa_call_args PARAMS ((struct call_desc *)); 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)); @@ -511,15 +502,18 @@ static void pa_level 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)); @@ -540,6 +534,10 @@ static ssd_chain_struct *pa_subsegment_to_subspace PARAMS ((asection *, 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, @@ -551,11 +549,8 @@ static int reg_name_search PARAMS ((char *)); 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)); @@ -564,6 +559,7 @@ static void pa_build_unwind_subspace PARAMS ((struct call_info *)); /* 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; @@ -571,6 +567,7 @@ 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; @@ -597,7 +594,12 @@ const pseudo_typeS md_pseudo_table[] = { /* 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}, @@ -632,7 +634,9 @@ const pseudo_typeS md_pseudo_table[] = {"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}, @@ -643,11 +647,15 @@ const pseudo_typeS md_pseudo_table[] = {"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}, @@ -997,6 +1005,7 @@ static const struct selector_entry selector_table[] = {"t", e_tsel}, }; +#ifdef OBJ_SOM /* default space and subspace dictionaries */ #define GDB_SYMBOLS GDB_SYMBOLS_SUBSPACE_NAME @@ -1014,31 +1023,23 @@ static const struct selector_entry selector_table[] = 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 @@ -1047,6 +1048,12 @@ static struct default_space_dict pa_def_spaces[] = #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. */ @@ -1100,18 +1107,6 @@ pa_check_eof () 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. */ @@ -1119,13 +1114,20 @@ static label_symbol_struct * 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; } @@ -1138,7 +1140,6 @@ pa_define_label (symbol) 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; @@ -1148,7 +1149,12 @@ pa_define_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) @@ -1166,13 +1172,19 @@ pa_undefine_label () { 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) @@ -1306,7 +1318,9 @@ md_begin () flag_readonly_data_in_text = 0; } +#ifdef OBJ_SOM pa_spaces_begin (); +#endif op_hash = hash_new (); @@ -1336,9 +1350,11 @@ md_begin () 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"); @@ -1430,8 +1446,10 @@ pa_ip (str) 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) @@ -2760,6 +2778,7 @@ tc_gen_reloc (section, fixp) relocs[n_relocs] = NULL; #ifdef OBJ_ELF +#if 0 switch (fixp->fx_r_type) { default: @@ -2811,6 +2830,7 @@ tc_gen_reloc (section, fixp) } break; } +#endif #else /* OBJ_SOM */ /* Walk over reach relocation returned by the BFD backend. */ @@ -3080,9 +3100,11 @@ md_apply_fix (fixP, valp) 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 @@ -4158,6 +4180,7 @@ pa_parse_neg_add_cmpltr (s, isbranch) return cmpltr; } +#ifdef OBJ_SOM /* Handle an alignment directive. Special so that we can update the alignment of the subspace if necessary. */ static void @@ -4174,6 +4197,7 @@ pa_align (bytes) if (log2 (bytes) != -1) record_alignment (current_subspace->ssd_seg, log2 (bytes)); } +#endif /* Handle a .BLOCK type pseudo-op. */ @@ -4186,8 +4210,10 @@ pa_block (z) 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 (); @@ -4265,8 +4291,10 @@ static void 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 (); @@ -4350,6 +4378,7 @@ static void pa_build_unwind_subspace (call_info) struct call_info *call_info; { +#if 0 char *unwind; asection *seg, *save_seg; subsegT subseg, save_subseg; @@ -4411,6 +4440,7 @@ pa_build_unwind_subspace (call_info) /* Return back to the original segment/subsegment. */ subseg_set (save_seg, save_subseg); +#endif } #endif @@ -4425,8 +4455,10 @@ pa_callinfo (unused) 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) @@ -4563,9 +4595,11 @@ static void 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 (); } @@ -4634,8 +4668,10 @@ static void 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 (); @@ -4647,8 +4683,10 @@ static void 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.")); @@ -4752,8 +4790,10 @@ static void 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")); @@ -4918,7 +4958,9 @@ pa_type_args (symbolP, is_export) 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. */ @@ -4930,7 +4972,9 @@ pa_type_args (symbolP, is_export) 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. */ @@ -4940,7 +4984,9 @@ pa_type_args (symbolP, is_export) *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; } @@ -5045,8 +5091,10 @@ static void 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 (); @@ -5093,8 +5141,10 @@ static void 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 (); @@ -5144,8 +5194,10 @@ pa_proc (unused) { 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")); @@ -5211,8 +5263,10 @@ pa_procend (unused) 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 @@ -5273,6 +5327,38 @@ pa_procend (unused) 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. */ @@ -5541,24 +5627,6 @@ pa_spnum (unused) 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. @@ -5569,7 +5637,7 @@ static void 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; @@ -5603,7 +5671,6 @@ pa_subspace (create_new) space_index = ~0; alignment = 1; quadrant = 0; - alias = NULL; space = current_space; if (create_new) @@ -5640,8 +5707,6 @@ pa_subspace (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++; @@ -5750,14 +5815,6 @@ pa_subspace (create_new) 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); @@ -5814,10 +5871,7 @@ pa_spaces_begin () 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, @@ -5837,16 +5891,8 @@ pa_spaces_begin () /* 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); @@ -5855,7 +5901,7 @@ pa_spaces_begin () /* 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); @@ -5865,7 +5911,7 @@ pa_spaces_begin () | 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); @@ -5876,14 +5922,14 @@ pa_spaces_begin () } - 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, @@ -5892,8 +5938,7 @@ pa_spaces_begin () | 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, @@ -5902,7 +5947,7 @@ pa_spaces_begin () | 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, @@ -6053,7 +6098,7 @@ create_new_subspace (space, name, loadable, code_only, common, 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; @@ -6272,7 +6317,6 @@ pa_subspace_start (space, quadrant) 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) @@ -6281,7 +6325,6 @@ pa_subspace_start (space, quadrant) return 0x40000000; else return 0; -#endif return 0; } @@ -6294,6 +6337,7 @@ pa_next_subseg (space) space->sd_last_subseg++; return space->sd_last_subseg; } +#endif /* Helper function for pa_stringer. Used to find the end of a string. */ @@ -6304,8 +6348,10 @@ pa_stringer_aux (s) { 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) { @@ -6446,9 +6492,11 @@ static void 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 (); } @@ -6469,8 +6517,10 @@ static void 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 (); @@ -6482,8 +6532,10 @@ static void 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 (); @@ -6495,8 +6547,10 @@ static void 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 (); @@ -6508,9 +6562,11 @@ static void 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 (); @@ -6627,6 +6683,7 @@ hppa_force_relocation (fixp) #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? */ @@ -6635,6 +6692,7 @@ hppa_force_relocation (fixp) 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. */ -- 2.34.1