From 7a621144429a4760ba888069d08bd190e3557119 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Sat, 5 Jan 2002 19:06:52 +0000 Subject: [PATCH] 2002-01-05 Daniel Jacobowitz * tc-mips.c (mips_cprestore_valid): New flag. (mips_frame_reg_valid): New flag. (macro) [M_JAL_2]: Check both flags. [M_JAL_A]: Likewise. (s_cprestore): Set mips_cprestore_valid. (tc_get_register): If setting mips_frame_reg, set mips_frame_reg_valid and clear mips_cprestore_valid. (s_mips_ent): Clear both flags. (s_mips_end): Clear both flags. 2002-01-05 Daniel Jacobowitz * gas/mips/jal-svr4pic.s: Add .ent and .frame directives. * gas/mips/mips-abi32-pic.s: Add .frame directive. * gas/mips/mips-gp32-fp32-pic.s: Likewise. * gas/mips/mips-gp32-fp64-pic.s: Likewise. * gas/mips/mips-gp64-fp32-pic.s: Likewise. * gas/mips/mips-gp64-fp64-pic.s: Likewise. --- gas/ChangeLog | 12 ++++++ gas/config/tc-mips.c | 47 ++++++++++++++++++++- gas/testsuite/ChangeLog | 9 ++++ gas/testsuite/gas/mips/jal-svr4pic.s | 4 ++ gas/testsuite/gas/mips/mips-abi32-pic.s | 1 + gas/testsuite/gas/mips/mips-gp32-fp32-pic.s | 1 + gas/testsuite/gas/mips/mips-gp32-fp64-pic.s | 1 + gas/testsuite/gas/mips/mips-gp64-fp32-pic.s | 1 + gas/testsuite/gas/mips/mips-gp64-fp64-pic.s | 1 + 9 files changed, 76 insertions(+), 1 deletion(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index c1c52f34ad..b90a726fcb 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,15 @@ +2002-01-05 Daniel Jacobowitz + + * tc-mips.c (mips_cprestore_valid): New flag. + (mips_frame_reg_valid): New flag. + (macro) [M_JAL_2]: Check both flags. + [M_JAL_A]: Likewise. + (s_cprestore): Set mips_cprestore_valid. + (tc_get_register): If setting mips_frame_reg, set + mips_frame_reg_valid and clear mips_cprestore_valid. + (s_mips_ent): Clear both flags. + (s_mips_end): Clear both flags. + 2002-01-05 Alan Modra * write.c (write_object_file): Make use of bfd_section_list_remove. diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 23cfc45f4d..3646127799 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -412,10 +412,18 @@ static offsetT mips_cpreturn_offset = -1; static int mips_cpreturn_register = -1; static int mips_gp_register = GP; +/* Whether mips_cprestore_offset has been set in the current function + (or whether it has already been warned about, if not). */ +static int mips_cprestore_valid = 0; + /* This is the register which holds the stack frame, as set by the .frame pseudo-op. This is needed to implement .cprestore. */ static int mips_frame_reg = SP; +/* Whether mips_frame_reg has been set in the current function + (or whether it has already been warned about, if not). */ +static int mips_frame_reg_valid = 0; + /* To output NOP instructions correctly, we need to keep information about the previous two instructions. */ @@ -5110,6 +5118,18 @@ macro (ip) as_warn (_("No .cprestore pseudo-op used in PIC code")); else { + if (! mips_frame_reg_valid) + { + as_warn (_("No .frame pseudo-op used in PIC code")); + /* Quiet this warning. */ + mips_frame_reg_valid = 1; + } + if (! mips_cprestore_valid) + { + as_warn (_("No .cprestore pseudo-op used in PIC code")); + /* Quiet this warning. */ + mips_cprestore_valid = 1; + } expr1.X_add_number = mips_cprestore_offset; macro_build ((char *) NULL, &icnt, &expr1, HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", @@ -5211,6 +5231,18 @@ macro (ip) as_warn (_("No .cprestore pseudo-op used in PIC code")); else { + if (! mips_frame_reg_valid) + { + as_warn (_("No .frame pseudo-op used in PIC code")); + /* Quiet this warning. */ + mips_frame_reg_valid = 1; + } + if (! mips_cprestore_valid) + { + as_warn (_("No .cprestore pseudo-op used in PIC code")); + /* Quiet this warning. */ + mips_cprestore_valid = 1; + } if (mips_opts.noreorder) macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", ""); @@ -11472,6 +11504,7 @@ s_cprestore (ignore) } mips_cprestore_offset = get_absolute_expression (); + mips_cprestore_valid = 1; ex.X_op = O_constant; ex.X_add_symbol = NULL; @@ -11738,7 +11771,11 @@ tc_get_register (frame) input_line_pointer += 2; } if (frame) - mips_frame_reg = reg != 0 ? reg : SP; + { + mips_frame_reg = reg != 0 ? reg : SP; + mips_frame_reg_valid = 1; + mips_cprestore_valid = 0; + } return reg; } @@ -12806,6 +12843,10 @@ s_mips_end (x) symbolS *p; int maybe_text; + /* Following functions need their own .frame and .cprestore directives. */ + mips_frame_reg_valid = 0; + mips_cprestore_valid = 0; + if (!is_end_of_line[(unsigned char) *input_line_pointer]) { p = get_symbol (); @@ -12923,6 +12964,10 @@ s_mips_ent (aent) if (!aent) { + /* This function needs its own .frame and .cprestore directives. */ + mips_frame_reg_valid = 0; + mips_cprestore_valid = 0; + cur_proc_ptr = &cur_proc; memset (cur_proc_ptr, '\0', sizeof (procS)); diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 7fdf423a73..4fbd74da5b 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2002-01-05 Daniel Jacobowitz + + * gas/mips/jal-svr4pic.s: Add .ent and .frame directives. + * gas/mips/mips-abi32-pic.s: Add .frame directive. + * gas/mips/mips-gp32-fp32-pic.s: Likewise. + * gas/mips/mips-gp32-fp64-pic.s: Likewise. + * gas/mips/mips-gp64-fp32-pic.s: Likewise. + * gas/mips/mips-gp64-fp64-pic.s: Likewise. + 2002-01-02 Chris Demetriou * gas/mips/empic3_e.d: New file to test -membedded-pic diff --git a/gas/testsuite/gas/mips/jal-svr4pic.s b/gas/testsuite/gas/mips/jal-svr4pic.s index 1174e94817..5e2df1e162 100644 --- a/gas/testsuite/gas/mips/jal-svr4pic.s +++ b/gas/testsuite/gas/mips/jal-svr4pic.s @@ -2,7 +2,9 @@ .weak weak_text_label + .ent text_label text_label: + .frame $sp,0,$31 .set noreorder .cpload $25 .set reorder @@ -19,3 +21,5 @@ text_label: # Round to a 16 byte boundary, for ease in testing multiple targets. nop nop + + .end text_label diff --git a/gas/testsuite/gas/mips/mips-abi32-pic.s b/gas/testsuite/gas/mips/mips-abi32-pic.s index 066fb70e68..2b05a8ebea 100644 --- a/gas/testsuite/gas/mips/mips-abi32-pic.s +++ b/gas/testsuite/gas/mips/mips-abi32-pic.s @@ -12,6 +12,7 @@ unshared: .text .ent func func: + .frame $sp,0,$31 .set noreorder .cpload $25 # 0000 lui gp,hi(_gp_disp) # 0004 addiu gp,gp,lo(_gp_disp) diff --git a/gas/testsuite/gas/mips/mips-gp32-fp32-pic.s b/gas/testsuite/gas/mips/mips-gp32-fp32-pic.s index b5e06a772d..d709810b75 100644 --- a/gas/testsuite/gas/mips/mips-gp32-fp32-pic.s +++ b/gas/testsuite/gas/mips/mips-gp32-fp32-pic.s @@ -12,6 +12,7 @@ unshared: .text .ent func func: + .frame $sp,0,$31 .set noreorder .cpload $25 # 0000 lui gp,hi(_gp_disp) # 0004 addiu gp,gp,lo(_gp_disp) diff --git a/gas/testsuite/gas/mips/mips-gp32-fp64-pic.s b/gas/testsuite/gas/mips/mips-gp32-fp64-pic.s index 050124421d..6d718aa689 100644 --- a/gas/testsuite/gas/mips/mips-gp32-fp64-pic.s +++ b/gas/testsuite/gas/mips/mips-gp32-fp64-pic.s @@ -12,6 +12,7 @@ unshared: .text .ent func func: + .frame $sp,0,$31 .set noreorder .cpload $25 # 0000 lui gp,hi(_gp_disp) # 0004 addiu gp,gp,lo(_gp_disp) diff --git a/gas/testsuite/gas/mips/mips-gp64-fp32-pic.s b/gas/testsuite/gas/mips/mips-gp64-fp32-pic.s index f138d13be9..6d62890924 100644 --- a/gas/testsuite/gas/mips/mips-gp64-fp32-pic.s +++ b/gas/testsuite/gas/mips/mips-gp64-fp32-pic.s @@ -12,6 +12,7 @@ unshared: .text .ent func func: + .frame $sp,0,$31 .set noreorder .cpload $25 # 0000 lui gp,hi(_gp_disp) # 0004 addiu gp,gp,lo(_gp_disp) diff --git a/gas/testsuite/gas/mips/mips-gp64-fp64-pic.s b/gas/testsuite/gas/mips/mips-gp64-fp64-pic.s index 195dc5ca5e..0d42de3c60 100644 --- a/gas/testsuite/gas/mips/mips-gp64-fp64-pic.s +++ b/gas/testsuite/gas/mips/mips-gp64-fp64-pic.s @@ -12,6 +12,7 @@ unshared: .text .ent func func: + .frame $sp,0,$31 .set noreorder .cpload $25 # 0000 lui gp,hi(_gp_disp) # 0004 addiu gp,gp,lo(_gp_disp) -- 2.34.1