PATCH Re: bad interaction between PIC and linkonce sections on linux/ia86
scott snyder
snyder@fnal.gov
Mon Apr 3 11:16:00 GMT 2000
hi -
Here's a patch for the problem with generating PIC code for i686 machines
i reported in:
http://gcc.gnu.org/ml/gcc-bugs/2000-03/msg00056.html
I took Martin's suggestion
( http://gcc.gnu.org/ml/gcc-bugs/2000-03/msg00072.html )
and fixed it by forcing the PIC label (LPR0) to go into the text section.
This also required adding code in varasm.c to switch back to the
proper section after calling ASM_OUTPUT_FUNCTION_PREFIX. (I didn't
see any good way to put the section resoration inside
asm_output_function_prefix.)
I've verified that the compiler bootstraps on an i686 with this change,
and that the number of failures in the testsuite does not change.
thanks,
sss
2000-04-02 scott snyder <snyder@fnal.gov>
* varasm.c (assemble_start_function): Allow
ASM_OUTPUT_FUNCTION_PREFIX to change the assembler section
* config/i386/i386.c (asm_output_function_prefix): Force the PIC
label used with TARGET_DEEP_BRANCH_PREDICTION into the text
section.
Index: varasm.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/varasm.c,v
retrieving revision 1.110
diff -u -p -r1.110 varasm.c
--- varasm.c 2000/03/25 18:34:05 1.110
+++ varasm.c 2000/04/03 17:58:17
@@ -1039,7 +1039,12 @@ assemble_start_function (decl, fnname)
}
#ifdef ASM_OUTPUT_FUNCTION_PREFIX
- ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
+ {
+ enum in_section saved_in_section = in_section;
+ ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
+ if (in_section != saved_in_section)
+ function_section (decl);
+ }
#endif
#ifdef SDB_DEBUGGING_INFO
Index: config/i386/i386.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/i386/i386.c,v
retrieving revision 1.151
diff -u -p -r1.151 i386.c
--- i386.c 2000/03/30 13:46:05 1.151
+++ i386.c 2000/04/03 17:58:44
@@ -1604,6 +1604,10 @@ asm_output_function_prefix (file, name)
{
if (!pic_label_output)
{
+ /* Make sure that this doesn't get into a linkonce section
+ being used for template instantiation. */
+ text_section ();
+
/* This used to call ASM_DECLARE_FUNCTION_NAME() but since it's an
internal (non-global) label that's being emitted, it didn't make
sense to have .type information for local labels. This caused
More information about the Gcc-patches
mailing list