diff options
author | Tristan Gingold <gingold@adacore.com> | 2012-04-20 10:21:33 +0000 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2012-04-20 10:21:33 +0000 |
commit | 2b0bc5014853ea965942e57161169cbac1d16d23 (patch) | |
tree | 5bb7d9beddb41fc2525c97333635f714fec0f230 /gas/config | |
parent | 4fb2c64af1600ac1928a66464539b4177aaaed1a (diff) | |
download | gdb-2b0bc5014853ea965942e57161169cbac1d16d23.zip gdb-2b0bc5014853ea965942e57161169cbac1d16d23.tar.gz gdb-2b0bc5014853ea965942e57161169cbac1d16d23.tar.bz2 |
2012-04-20 Tristan Gingold <gingold@adacore.com>
* config/tc-ia64.c (obj_elf_vms_common): New function.
(md_pseudo_table): Add .vms_common pseudo.
* config/obj-elf.h (obj_elf_section_name): Add a prototype.
* config/obj-elf.c (obj_elf_section_name): Make it public.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-ia64.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c index a5100c2..cd3a1db 100644 --- a/gas/config/tc-ia64.c +++ b/gas/config/tc-ia64.c @@ -1039,6 +1039,141 @@ ia64_cons_align (int nbytes) } } +#ifdef TE_VMS + +/* .vms_common section, symbol, size, alignment */ + +static void +obj_elf_vms_common (int ignore ATTRIBUTE_UNUSED) +{ + char *sec_name; + char *sym_name; + char c; + offsetT size; + offsetT cur_size; + offsetT temp; + symbolS *symbolP; + segT current_seg = now_seg; + subsegT current_subseg = now_subseg; + offsetT log_align; + + /* Section name. */ + sec_name = obj_elf_section_name (); + if (sec_name == NULL) + return; + + /* Symbol name. */ + SKIP_WHITESPACE (); + if (*input_line_pointer == ',') + { + input_line_pointer++; + SKIP_WHITESPACE (); + } + else + { + as_bad (_("expected ',' after section name")); + ignore_rest_of_line (); + return; + } + + sym_name = input_line_pointer; + c = get_symbol_end (); + + if (input_line_pointer == sym_name) + { + *input_line_pointer = c; + as_bad (_("expected symbol name")); + ignore_rest_of_line (); + return; + } + + symbolP = symbol_find_or_make (sym_name); + *input_line_pointer = c; + + if ((S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP)) + && !S_IS_COMMON (symbolP)) + { + as_bad (_("Ignoring attempt to re-define symbol")); + ignore_rest_of_line (); + return; + } + + /* Symbol size. */ + SKIP_WHITESPACE (); + if (*input_line_pointer == ',') + { + input_line_pointer++; + SKIP_WHITESPACE (); + } + else + { + as_bad (_("expected ',' after symbol name")); + ignore_rest_of_line (); + return; + } + + temp = get_absolute_expression (); + size = temp; + size &= ((offsetT) 2 << (stdoutput->arch_info->bits_per_address - 1)) - 1; + if (temp != size) + { + as_warn (_("size (%ld) out of range, ignored"), (long) temp); + ignore_rest_of_line (); + return; + } + + /* Alignment. */ + SKIP_WHITESPACE (); + if (*input_line_pointer == ',') + { + input_line_pointer++; + SKIP_WHITESPACE (); + } + else + { + as_bad (_("expected ',' after symbol size")); + ignore_rest_of_line (); + return; + } + + log_align = get_absolute_expression (); + + demand_empty_rest_of_line (); + + obj_elf_change_section + (sec_name, SHT_NOBITS, + SHF_ALLOC | SHF_WRITE | SHF_IA_64_VMS_OVERLAID | SHF_IA_64_VMS_GLOBAL, + 0, NULL, 1, 0); + + S_SET_VALUE (symbolP, 0); + S_SET_SIZE (symbolP, size); + S_SET_EXTERNAL (symbolP); + S_SET_SEGMENT (symbolP, now_seg); + + symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT; + + record_alignment (now_seg, log_align); + + cur_size = bfd_section_size (stdoutput, now_seg); + if ((int) size > cur_size) + { + char *pfrag + = frag_var (rs_fill, 1, 1, (relax_substateT)0, NULL, + (valueT)size - (valueT)cur_size, NULL); + *pfrag = 0; + bfd_section_size (stdoutput, now_seg) = size; + } + + /* Switch back to current segment. */ + subseg_set (current_seg, current_subseg); + +#ifdef md_elf_section_change_hook + md_elf_section_change_hook (); +#endif +} + +#endif /* TE_VMS */ + /* Output COUNT bytes to a memory location. */ static char *vbyte_mem_ptr = NULL; @@ -5232,6 +5367,10 @@ const pseudo_typeS md_pseudo_table[] = {"4byte", stmt_cons_ua, 4}, {"8byte", stmt_cons_ua, 8}, +#ifdef TE_VMS + {"vms_common", obj_elf_vms_common, 0}, +#endif + { NULL, 0, 0 } }; |