aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>2005-12-12 17:17:51 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2005-12-12 17:17:51 +0000
commit1a83bfc389e6868cfa64bf094d0ea70035c5a983 (patch)
tree257b9cf6476f4b740eebd29afffbd1869bc1f461
parentffb99c1eba5ccc1ac92b08e3f387f801afca968c (diff)
downloadgcc-1a83bfc389e6868cfa64bf094d0ea70035c5a983.zip
gcc-1a83bfc389e6868cfa64bf094d0ea70035c5a983.tar.gz
gcc-1a83bfc389e6868cfa64bf094d0ea70035c5a983.tar.bz2
re PR target/25258 ([4.0 regression/hpux] gcc generates incorrect stabs debug output)
PR target/25258 * pa.c (pa_output_function_epilogue): Set cfun->machine->in_nsubspa to indicate function epilogue has been output. (pa_asm_output_mi_thunk): Likewise. (output_deferred_plabels): Put plabels in readonly data section when not generating PIC code. (som_output_text_section_asm_op): Use .NSUBSPA to output debug information. Add assert. (som_output_comdat_data_section_asm_op): New function. (pa_som_asm_init_sections): Use som_output_comdat_data_section_asm_op instead of output_section_asm_op for COMDAT sections. From-SVN: r108420
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/config/pa/pa.c58
2 files changed, 53 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 063cc3f..c84e5a6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2005-12-12 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
+
+ * pa.c (pa_output_function_epilogue): Set cfun->machine->in_nsubspa to
+ indicate function epilogue has been output.
+ (pa_asm_output_mi_thunk): Likewise.
+ (output_deferred_plabels): Put plabels in readonly data section when
+ not generating PIC code.
+ (som_output_text_section_asm_op): Use .NSUBSPA to output debug
+ information. Add assert.
+ (som_output_comdat_data_section_asm_op): New function.
+ (pa_som_asm_init_sections): Use som_output_comdat_data_section_asm_op
+ instead of output_section_asm_op for COMDAT sections.
+
2005-12-12 J"orn Rennecke <joern.rennecke@st.com>
* cfgcleanup.c (condjump_equiv_p, try_crossjump_to_edge):
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index ea2a9fa..a16c6af 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -3935,6 +3935,7 @@ pa_output_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
debug information. Forget that we are in this subspace to ensure
that the next function is output in its own subspace. */
in_section = NULL;
+ cfun->machine->in_nsubspa = 2;
}
if (INSN_ADDRESSES_SET_P ())
@@ -5300,12 +5301,13 @@ static void
output_deferred_plabels (void)
{
size_t i;
- /* If we have deferred plabels, then we need to switch into the data
- section and align it to a 4 byte boundary before we output the
- deferred plabels. */
+
+ /* If we have some deferred plabels, then we need to switch into the
+ data or readonly data section, and align it to a 4 byte boundary
+ before outputing the deferred plabels. */
if (n_deferred_plabels)
{
- switch_to_section (data_section);
+ switch_to_section (flag_pic ? data_section : readonly_data_section);
ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
}
@@ -7799,6 +7801,15 @@ pa_asm_output_mi_thunk (FILE *file, tree thunk_fndecl, HOST_WIDE_INT delta,
fprintf (file, "\t.EXIT\n\t.PROCEND\n");
+ if (TARGET_SOM && TARGET_GAS)
+ {
+ /* We done with this subspace except possibly for some additional
+ debug information. Forget that we are in this subspace to ensure
+ that the next function is output in its own subspace. */
+ in_section = NULL;
+ cfun->machine->in_nsubspa = 2;
+ }
+
if (TARGET_SOM && flag_pic && TREE_PUBLIC (function))
{
switch_to_section (data_section);
@@ -7806,8 +7817,6 @@ pa_asm_output_mi_thunk (FILE *file, tree thunk_fndecl, HOST_WIDE_INT delta,
ASM_OUTPUT_LABEL (file, label);
output_asm_insn (".word P'%0", xoperands);
}
- else if (TARGET_SOM && TARGET_GAS)
- in_section = NULL;
current_thunk_number++;
nbytes = ((nbytes + FUNCTION_BOUNDARY / BITS_PER_UNIT - 1)
@@ -9058,27 +9067,39 @@ som_output_text_section_asm_op (const void *data ATTRIBUTE_UNUSED)
if (cfun->decl
&& DECL_ONE_ONLY (cfun->decl)
&& !DECL_WEAK (cfun->decl))
- output_section_asm_op ("\t.SPACE $TEXT$\n"
- "\t.NSUBSPA $CODE$,QUAD=0,ALIGN=8,"
- "ACCESS=44,SORT=24,COMDAT");
- else
- output_section_asm_op ("\t.SPACE $TEXT$\n\t.NSUBSPA $CODE$");
- return;
+ {
+ output_section_asm_op ("\t.SPACE $TEXT$\n"
+ "\t.NSUBSPA $CODE$,QUAD=0,ALIGN=8,"
+ "ACCESS=44,SORT=24,COMDAT");
+ return;
+ }
}
else
{
/* There isn't a current function or the body of the current
function has been completed. So, we are changing to the
- text section to output debugging information. Do this in
- the default text section. We need to forget that we are
- in the text section so that varasm.c will call us when
- text_section is selected again. */
+ text section to output debugging information. Thus, we
+ need to forget that we are in the text section so that
+ varasm.c will call us when text_section is selected again. */
+ gcc_assert (!cfun || cfun->machine->in_nsubspa == 2);
in_section = NULL;
}
+ output_section_asm_op ("\t.SPACE $TEXT$\n\t.NSUBSPA $CODE$");
+ return;
}
output_section_asm_op ("\t.SPACE $TEXT$\n\t.SUBSPA $CODE$");
}
+/* A get_unnamed_section callback for switching to comdat data
+ sections. This function is only used with SOM. */
+
+static void
+som_output_comdat_data_section_asm_op (const void *data)
+{
+ in_section = NULL;
+ output_section_asm_op (data);
+}
+
/* Implement TARGET_ASM_INITIALIZE_SECTIONS */
static void
@@ -9097,7 +9118,7 @@ pa_som_asm_init_sections (void)
data one-only by creating a new $LIT$ subspace in $TEXT$ with
the comdat flag. */
som_one_only_readonly_data_section
- = get_unnamed_section (0, output_section_asm_op,
+ = get_unnamed_section (0, som_output_comdat_data_section_asm_op,
"\t.SPACE $TEXT$\n"
"\t.NSUBSPA $LIT$,QUAD=0,ALIGN=8,"
"ACCESS=0x2c,SORT=16,COMDAT");
@@ -9106,7 +9127,8 @@ pa_som_asm_init_sections (void)
/* When secondary definitions are not supported, SOM makes data one-only
by creating a new $DATA$ subspace in $PRIVATE$ with the comdat flag. */
som_one_only_data_section
- = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
+ = get_unnamed_section (SECTION_WRITE,
+ som_output_comdat_data_section_asm_op,
"\t.SPACE $PRIVATE$\n"
"\t.NSUBSPA $DATA$,QUAD=1,ALIGN=8,"
"ACCESS=31,SORT=24,COMDAT");