(md_pseudo_table): Add it.
(alpha_cfi_frame_initial_instructions): New.
* config/tc-alpha.h (TARGET_USE_CFIPOP): New.
(tc_cfi_frame_initial_instructions): New.
* doc/c-alpha.texi: Document .usepv.
* gas/alpha/elf-usepv-1.[sd]: New.
* gas/alpha/elf-usepv-2.[sd]: New.
* gas/alpha/alpha.exp: Run them.
* gas/cfi/cfi-alpha-3.[sd]: New.
* gas/cfi/cfi.exp: Run it.
+2003-06-04 Richard Henderson <rth@redhat.com>
+
+ * config/tc-alpha.c (s_alpha_usepv): New.
+ (md_pseudo_table): Add it.
+ (alpha_cfi_frame_initial_instructions): New.
+ * config/tc-alpha.h (TARGET_USE_CFIPOP): New.
+ (tc_cfi_frame_initial_instructions): New.
+ * doc/c-alpha.texi: Document .usepv.
+
2003-06-04 Jakub Jelinek <jakub@redhat.com>
* as.c (show_usage): Document --execstack and --noexecstack.
static void s_alpha_loc PARAMS ((int));
static void s_alpha_stab PARAMS ((int));
static void s_alpha_coff_wrapper PARAMS ((int));
+static void s_alpha_usepv PARAMS ((int));
#endif
#ifdef OBJ_EVAX
static void s_alpha_section PARAMS ((int));
cfi_end_fde (p->func_end_sym);
}
}
+
+static void
+s_alpha_usepv (int unused ATTRIBUTE_UNUSED)
+{
+ char *name, name_end;
+ char *which, which_end;
+ symbolS *sym;
+ int other;
+
+ name = input_line_pointer;
+ name_end = get_symbol_end ();
+
+ if (! is_name_beginner (*name))
+ {
+ as_bad (_(".usepv directive has no name"));
+ *input_line_pointer = name_end;
+ ignore_rest_of_line ();
+ return;
+ }
+
+ sym = symbol_find_or_make (name);
+ *input_line_pointer++ = name_end;
+
+ if (name_end != ',')
+ {
+ as_bad (_(".usepv directive has no type"));
+ ignore_rest_of_line ();
+ return;
+ }
+
+ SKIP_WHITESPACE ();
+ which = input_line_pointer;
+ which_end = get_symbol_end ();
+
+ if (strcmp (which, "no") == 0)
+ other = STO_ALPHA_NOPV;
+ else if (strcmp (which, "std") == 0)
+ other = STO_ALPHA_STD_GPLOAD;
+ else
+ {
+ as_bad (_("unknown argument for .usepv"));
+ other = 0;
+ }
+
+ *input_line_pointer = which_end;
+ demand_empty_rest_of_line ();
+
+ S_SET_OTHER (sym, other | (S_GET_OTHER (sym) & ~STO_ALPHA_STD_GPLOAD));
+}
#endif /* OBJ_ELF */
+/* Standard calling conventions leaves the CFA at $30 on entry. */
+
+void
+alpha_cfi_frame_initial_instructions ()
+{
+ cfi_add_CFA_def_cfa_register (30);
+}
+
#ifdef OBJ_EVAX
/* Handle the section specific pseudo-op. */
{"loc", s_alpha_loc, 9},
{"stabs", s_alpha_stab, 's'},
{"stabn", s_alpha_stab, 'n'},
+ {"usepv", s_alpha_usepv, 0},
/* COFF debugging related pseudos. */
{"begin", s_alpha_coff_wrapper, 0},
{"bend", s_alpha_coff_wrapper, 1},
(long) FIX->tc_fix_data.next_reloc); \
} while (0)
+#define TARGET_USE_CFIPOP 1
+
+#define tc_cfi_frame_initial_instructions alpha_cfi_frame_initial_instructions
+extern void alpha_cfi_frame_initial_instructions(void);
+
#define DWARF2_LINE_MIN_INSN_LENGTH 4
#define DWARF2_DEFAULT_RETURN_COLUMN 26
#define DWARF2_CIE_DATA_ALIGNMENT -8
used in some non-standard way and so the linker cannot elide the load of
the procedure vector during relaxation.
+@item .usepv @var{function}, @var{which}
+Used to indicate the use of the @code{$27} register, similar to
+@code{.prologue}, but without the other semantics of needing to
+be inside an open @code{.ent}/@code{.end} block.
+
+The @var{which} argument should be either @code{no}, indicating that
+@code{$27} is not used, or @code{std}, indicating that the first two
+instructions of the function perform a GP load.
+
+One might use this directive instead of @code{.prologue} if you are
+also using dwarf2 CFI directives.
+
@item .gprel32 @var{expression}
Computes the difference between the address in @var{expression} and the
GP for the current object file, and stores it in 4 bytes. In addition
+2003-06-04 Richard Henderson <rth@redhat.com>
+
+ * gas/alpha/elf-usepv-1.[sd]: New.
+ * gas/alpha/elf-usepv-2.[sd]: New.
+ * gas/alpha/alpha.exp: Run them.
+ * gas/cfi/cfi-alpha-3.[sd]: New.
+ * gas/cfi/cfi.exp: Run it.
+
2003-05-31 Richard Henderson <rth@redhat.com>
* gas/alpha/elf-reloc-8.d: Correct .eh_frame relocs.
run_dump_test "elf-tls-1"
run_list_test "elf-tls-2" ""
run_list_test "elf-tls-3" ""
+ run_dump_test "elf-usepv-1"
+ run_list_test "elf-usepv-2" ""
}
run_dump_test "fp"
--- /dev/null
+#objdump: --syms
+#name: alpha elf-usepv-1
+
+.*: file format elf64-alpha
+
+SYMBOL TABLE:
+0*0000000 l d .text 0*0000000
+0*0000000 l d .data 0*0000000
+0*0000000 l d .bss 0*0000000
+0*0000000 l .text 0*0000000 0x80 foo
+0*0000004 l .text 0*0000000 0x88 bar
--- /dev/null
+ .usepv foo, no
+foo:
+ nop
+ .usepv bar, std
+bar:
+ nop
--- /dev/null
+.*: Assembler messages:
+.*:1: Error: unknown argument for .usepv
--- /dev/null
+ .usepv foo, bar
--- /dev/null
+#readelf: -wf
+#name: CFI on alpha, 3
+The section .eh_frame contains:
+
+00000000 00000010 00000000 CIE
+ Version: 1
+ Augmentation: "zR"
+ Code alignment factor: 4
+ Data alignment factor: -8
+ Return address column: 26
+ Augmentation data: 1b
+
+ DW_CFA_def_cfa_reg: r30
+ DW_CFA_nop
+
+00000014 00000024 00000018 FDE cie=00000000 pc=0000001c..0000005c
+ DW_CFA_advance_loc: 4 to 00000020
+ DW_CFA_def_cfa_offset: 32
+ DW_CFA_advance_loc: 4 to 00000024
+ DW_CFA_offset: r26 at cfa-32
+ DW_CFA_advance_loc: 4 to 00000028
+ DW_CFA_offset: r9 at cfa-24
+ DW_CFA_advance_loc: 4 to 0000002c
+ DW_CFA_offset: r15 at cfa-16
+ DW_CFA_advance_loc: 4 to 00000030
+ DW_CFA_offset: r34 at cfa-8
+ DW_CFA_advance_loc: 4 to 00000034
+ DW_CFA_def_cfa_reg: r15
+ DW_CFA_advance_loc: 36 to 00000058
+ DW_CFA_def_cfa: r30 ofs 0
+ DW_CFA_nop
+
--- /dev/null
+ .file 1 "z.c"
+ .set noat
+ .set noreorder
+.text
+ .align 4
+ .globl f
+ .type f,@function
+ .usepv f,no
+ .cfi_startproc
+f:
+ lda $30,-32($30)
+ .cfi_adjust_cfa_offset 32
+ stq $26,0($30)
+ .cfi_offset $26, -32
+ stq $9,8($30)
+ .cfi_offset $9, -24
+ stq $15,16($30)
+ .cfi_offset $15, -16
+ stt $f2,24($30)
+ .cfi_offset $f2, -8
+ mov $30,$15
+ .cfi_def_cfa_register $15
+
+ nop
+ nop
+ nop
+
+ mov $15,$30
+ ldq $26,0($30)
+ ldq $9,8($30)
+ ldt $f2,24($30)
+ ldq $15,16($30)
+ lda $30,32($30)
+ .cfi_def_cfa $30, 0
+ ret $31,($26),1
+ .size f, .-f
+ .cfi_endproc
if $elf {
run_dump_test "cfi-alpha-1"
run_dump_test "cfi-alpha-2"
+ run_dump_test "cfi-alpha-3"
}
}