> -----Original Message----- > From: gcc-ow...@gcc.gnu.org [mailto:gcc-ow...@gcc.gnu.org] On Behalf Of > Joseph S. Myers > Sent: 23 October 2012 15:28 > To: Paulo Matos > Cc: gcc@gcc.gnu.org > Subject: Re: Documentation problem with TEXT_SECTION_ASM_OP > > conversions of other macros are welcome. > The list on that wiki page may be a bit out of date, > but should still be a good starting point for this project. >
I gave it a go with TEXT_SECTION_ASM_OP. I started by changing crtstuff.c to use __LIBGCC_TEXT_SECTION_ASM_OP__ instead of TEXT_SECTION_ASM_OP. I noticed crtstuff.c is not compiled with -fbuilding-libgcc so I added the flags to CRTSTUFF_T_CFLAGS in my makefile fragment. Now to the changes in GCC itself: * Right where if(flag_building_libgcc) is, in c_cpp_builtins, the if becomes: /* For libgcc-internal use only. */ if (flag_building_libgcc) { /* For libgcc enable-execute-stack.c. */ builtin_define_with_int_value ("__LIBGCC_TRAMPOLINE_SIZE__", TRAMPOLINE_SIZE); /* For libgcc crtstuff.c. */ #ifdef TEXT_SECTION_ASM_OP builtin_define_with_value ("__LIBGCC_TEXT_SECTION_ASM_OP__", TEXT_SECTION_ASM_OP, true); #else /* Is text_section always an unnamed section? */ builtin_define_with_value ("__LIBGCC_TEXT_SECTION_ASM_OP__", (const char *)text_section->unnamed.data, true); #endif } The reason for the ifdef is because the docs allow the backend to define either TEXT_SECTION_ASM_OP or the text_section directly in TARGET_ASM_INIT_SECTIONS. Therefore if we don't have TEXT_SECTION_ASM_OP we need to grab the text string from text_section. I assumed text_section was defined in TARGET_ASM_INIT_SECTIONS with an unnamed section (that's how I did it) but I am unsure if this is a general assumption. Then remaining problem is that for preprocessing only no_backend from toplev.c is true and varasm initialization in that case doesn't run, so I changed do_compile to have: /* Set up the back-end if requested. */ if (!no_backend) backend_init (); else init_varasm_once (); This did the trick, but I am struggling with an interesting problem. Assume I want text_section asm op to be "\t.section .text, \"ax\"", so I would define #define TEXT_SECTION_ASM_OP "\t.section .text, \"ax\"" However, I decided to define it in TARGET_ASM_INIT_SECTIONS with: text_section = get_unnamed_section (SECTION_CODE, output_section_asm_op, "\t.section .text, \"ax\""); But when this gets to libgcc, if I preprocess crtstuff.c __LIBGCC_TEXT_ASM_OP__ is defined to: #define __LIBGCC_TEXT_SECTION_ASM_OP__ " .section .text, "axU"" If I debug cc1 to see what happens when this is defined I see that in builtin_define_with_value Variable buf is defined to: "__LIBGCC_TEXT_SECTION_ASM_OP__=\"\t.section .text, \"axU\"\"" Which is then passed to: cpp_define (parse_in, buf); I can workaround this In my port by adjusting the definition of text_section but it is slightly annoying. Do you have any hints as to why this happening and if there's a reasonable workaround? Also, if you're interested in this code (with any changes you might suggest) as a patch, I am happy to prepare one. Paulo Matos