aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/darwin.c
diff options
context:
space:
mode:
authorIain Sandoe <iain@codesourcery.com>2013-07-20 16:22:59 +0000
committerIain Sandoe <iains@gcc.gnu.org>2013-07-20 16:22:59 +0000
commit88d9bfe6b9b0a74d8898b2bfad60daa2b01c7049 (patch)
tree88e847313021b566970743f6d41c2ceb446ede0a /gcc/config/darwin.c
parent2d586fb43236fb518dd2644cef33d525684cddff (diff)
downloadgcc-88d9bfe6b9b0a74d8898b2bfad60daa2b01c7049.zip
gcc-88d9bfe6b9b0a74d8898b2bfad60daa2b01c7049.tar.gz
gcc-88d9bfe6b9b0a74d8898b2bfad60daa2b01c7049.tar.bz2
re PR target/51784 (PIC register not correctly preserved in nested funcs / with non-local goto)
gcc/ PR target/51784 * config/i386/i386.c (output_set_got) [TARGET_MACHO]: Adjust to emit a second label for nonlocal goto receivers. Don't output pic base labels unless we're producing PIC; mark that action unreachable(). (ix86_save_reg): If the function contains a nonlocal label, save the PIC base reg. * config/darwin-protos.h (machopic_should_output_picbase_label): New. * gcc/config/darwin.c (emitted_pic_label_num): New GTY. (update_pic_label_number_if_needed): New. (machopic_output_function_base_name): Adjust for nonlocal receiver case. (machopic_should_output_picbase_label): New. * config/i386/i386.md (enum unspecv): UNSPECV_NLGR: New. (nonlocal_goto_receiver): New insn and split. From-SVN: r201086
Diffstat (limited to 'gcc/config/darwin.c')
-rw-r--r--gcc/config/darwin.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index a049a5d..e07fa4c 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -369,14 +369,13 @@ machopic_gen_offset (rtx orig)
static GTY(()) const char * function_base_func_name;
static GTY(()) int current_pic_label_num;
+static GTY(()) int emitted_pic_label_num;
-void
-machopic_output_function_base_name (FILE *file)
+static void
+update_pic_label_number_if_needed (void)
{
const char *current_name;
- /* If dynamic-no-pic is on, we should not get here. */
- gcc_assert (!MACHO_DYNAMIC_NO_PIC_P);
/* When we are generating _get_pc thunks within stubs, there is no current
function. */
if (current_function_decl)
@@ -394,7 +393,28 @@ machopic_output_function_base_name (FILE *file)
++current_pic_label_num;
function_base_func_name = "L_machopic_stub_dummy";
}
- fprintf (file, "L%011d$pb", current_pic_label_num);
+}
+
+void
+machopic_output_function_base_name (FILE *file)
+{
+ /* If dynamic-no-pic is on, we should not get here. */
+ gcc_assert (!MACHO_DYNAMIC_NO_PIC_P);
+
+ update_pic_label_number_if_needed ();
+ fprintf (file, "L%d$pb", current_pic_label_num);
+}
+
+bool
+machopic_should_output_picbase_label (void)
+{
+ update_pic_label_number_if_needed ();
+
+ if (current_pic_label_num == emitted_pic_label_num)
+ return false;
+
+ emitted_pic_label_num = current_pic_label_num;
+ return true;
}
/* The suffix attached to non-lazy pointer symbols. */