summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2003-06-05 03:27:03 +0000
committerRichard Henderson <rth@redhat.com>2003-06-05 03:27:03 +0000
commit221b04317c101b30632ca779a0d2fc12eeba9d10 (patch)
tree9573f903520e51938ece0108f6e6673c404f393a /gas
parent4d71b6254be32984335c700443fd8fec6358a5a2 (diff)
downloadbinutils-redhat-221b04317c101b30632ca779a0d2fc12eeba9d10.tar.gz
* 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. * 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.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog9
-rw-r--r--gas/config/tc-alpha.c59
-rw-r--r--gas/config/tc-alpha.h5
-rw-r--r--gas/doc/c-alpha.texi12
-rw-r--r--gas/testsuite/ChangeLog8
-rw-r--r--gas/testsuite/gas/alpha/alpha.exp2
-rw-r--r--gas/testsuite/gas/alpha/elf-usepv-1.d11
-rw-r--r--gas/testsuite/gas/alpha/elf-usepv-1.s6
-rw-r--r--gas/testsuite/gas/alpha/elf-usepv-2.l2
-rw-r--r--gas/testsuite/gas/alpha/elf-usepv-2.s1
-rw-r--r--gas/testsuite/gas/cfi/cfi-alpha-3.d32
-rw-r--r--gas/testsuite/gas/cfi/cfi-alpha-3.s37
-rw-r--r--gas/testsuite/gas/cfi/cfi.exp1
13 files changed, 185 insertions, 0 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index fd23b8f73e..83a80c0a88 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,12 @@
+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.
diff --git a/gas/config/tc-alpha.c b/gas/config/tc-alpha.c
index a775c0d597..83dbd34444 100644
--- a/gas/config/tc-alpha.c
+++ b/gas/config/tc-alpha.c
@@ -267,6 +267,7 @@ static void s_alpha_file PARAMS ((int));
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));
@@ -4822,8 +4823,65 @@ alpha_elf_md_end (void)
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. */
@@ -5669,6 +5727,7 @@ const pseudo_typeS md_pseudo_table[] = {
{"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},
diff --git a/gas/config/tc-alpha.h b/gas/config/tc-alpha.h
index 44ccd4eded..d9275e2aef 100644
--- a/gas/config/tc-alpha.h
+++ b/gas/config/tc-alpha.h
@@ -161,6 +161,11 @@ do { \
(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
diff --git a/gas/doc/c-alpha.texi b/gas/doc/c-alpha.texi
index 359dfcc4d5..dfc05f46eb 100644
--- a/gas/doc/c-alpha.texi
+++ b/gas/doc/c-alpha.texi
@@ -379,6 +379,18 @@ to perform a load of the GP register; 2 indicates that @code{$27} is
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
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 82cef6c7cf..70d8fe8cf2 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+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.
diff --git a/gas/testsuite/gas/alpha/alpha.exp b/gas/testsuite/gas/alpha/alpha.exp
index 3281dcba9b..0afcc7c476 100644
--- a/gas/testsuite/gas/alpha/alpha.exp
+++ b/gas/testsuite/gas/alpha/alpha.exp
@@ -34,6 +34,8 @@ if { [istarget alpha*-*-*] } then {
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"
diff --git a/gas/testsuite/gas/alpha/elf-usepv-1.d b/gas/testsuite/gas/alpha/elf-usepv-1.d
new file mode 100644
index 0000000000..ba150befb3
--- /dev/null
+++ b/gas/testsuite/gas/alpha/elf-usepv-1.d
@@ -0,0 +1,11 @@
+#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
diff --git a/gas/testsuite/gas/alpha/elf-usepv-1.s b/gas/testsuite/gas/alpha/elf-usepv-1.s
new file mode 100644
index 0000000000..0d447aad4e
--- /dev/null
+++ b/gas/testsuite/gas/alpha/elf-usepv-1.s
@@ -0,0 +1,6 @@
+ .usepv foo, no
+foo:
+ nop
+ .usepv bar, std
+bar:
+ nop
diff --git a/gas/testsuite/gas/alpha/elf-usepv-2.l b/gas/testsuite/gas/alpha/elf-usepv-2.l
new file mode 100644
index 0000000000..35e3b26a1c
--- /dev/null
+++ b/gas/testsuite/gas/alpha/elf-usepv-2.l
@@ -0,0 +1,2 @@
+.*: Assembler messages:
+.*:1: Error: unknown argument for .usepv
diff --git a/gas/testsuite/gas/alpha/elf-usepv-2.s b/gas/testsuite/gas/alpha/elf-usepv-2.s
new file mode 100644
index 0000000000..5a583f9eb7
--- /dev/null
+++ b/gas/testsuite/gas/alpha/elf-usepv-2.s
@@ -0,0 +1 @@
+ .usepv foo, bar
diff --git a/gas/testsuite/gas/cfi/cfi-alpha-3.d b/gas/testsuite/gas/cfi/cfi-alpha-3.d
new file mode 100644
index 0000000000..b0c7d03c8f
--- /dev/null
+++ b/gas/testsuite/gas/cfi/cfi-alpha-3.d
@@ -0,0 +1,32 @@
+#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
+
diff --git a/gas/testsuite/gas/cfi/cfi-alpha-3.s b/gas/testsuite/gas/cfi/cfi-alpha-3.s
new file mode 100644
index 0000000000..a4ff13576f
--- /dev/null
+++ b/gas/testsuite/gas/cfi/cfi-alpha-3.s
@@ -0,0 +1,37 @@
+ .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
diff --git a/gas/testsuite/gas/cfi/cfi.exp b/gas/testsuite/gas/cfi/cfi.exp
index b6acaad6c4..0c24682ff3 100644
--- a/gas/testsuite/gas/cfi/cfi.exp
+++ b/gas/testsuite/gas/cfi/cfi.exp
@@ -16,5 +16,6 @@ if { [istarget alpha*-*-*] } then {
if $elf {
run_dump_test "cfi-alpha-1"
run_dump_test "cfi-alpha-2"
+ run_dump_test "cfi-alpha-3"
}
}