On Mon, Oct 25, 2021 at 6:32 PM Segher Boessenkool <seg...@kernel.crashing.org> wrote: > > Hi! > > On Mon, Oct 25, 2021 at 03:36:25PM +0200, Martin Liška wrote: > > --- a/gcc/config/rs6000/rs6000-internal.h > > +++ b/gcc/config/rs6000/rs6000-internal.h > > @@ -189,4 +189,13 @@ extern bool rs6000_passes_vector; > > extern bool rs6000_returns_struct; > > extern bool cpu_builtin_p; > > > > +struct rs6000_asm_out_state : public asm_out_state > > +{ > > + /* Initialize ELF sections. */ > > + void init_elf_sections (); > > + > > + /* Initialize XCOFF sections. */ > > + void init_xcoff_sections (); > > +}; > > Our coding convention says to use "class", not "struct" (since this > isn't valid C code at all). > > > - sdata2_section > > + sec.sdata2 > > = get_unnamed_section (SECTION_WRITE, output_section_asm_op, > > SDATA2_SECTION_ASM_OP); > > (broken indentation) > > > +/* Implement TARGET_ASM_INIT_SECTIONS. */ > > That comment is out-of-date. > > > +static asm_out_state * > > +rs6000_elf_asm_init_sections (void) > > +{ > > + rs6000_asm_out_state *target_state > > + = new (ggc_alloc<rs6000_asm_out_state> ()) rs6000_asm_out_state (); > > Hrm, maybe we can have a macro or function that does this, ggc_new or > something? > > > +/* Implement TARGET_ASM_INIT_SECTIONS. */ > > + > > +static asm_out_state * > > +rs6000_xcoff_asm_init_sections (void) > > Here, too. Both implementations are each one of several functions that > together implement the target macro. > > > + /* The section that holds the DWARF2 frame unwind information, when > > known. > > + The section is set either by the target's init_sections hook or by > > the > > + first call to switch_to_eh_frame_section. */ > > + section *eh_frame; > > + > > + /* RS6000 sections. */ > > Nothing here? Just remove the comment header? > > The idea looks fine to me.
Yeah, of course then the target hook does not need to do the allocation and we could simply keep the current init_sections hook but change it to take the asm_out_state to initialize as argument. Note that I'd put + /* RS6000 sections. */ + + /* ELF sections. */ + section *toc; + section *sdata2; + + /* XCOFF sections. */ + section *read_only_data; + section *private_data; + section *tls_data; + section *tls_private_data; + section *read_only_private_data; into a union, thus union { struct /* RS6000 sections */ { /* ELF sections. */ section *toc; ... } rs6000; struct /* darwin sections */ { ... }; not sure whether we need some magic GTY marking here to make it pick up the 'correct' set. Another alternative would be section *target[MAX_TARGET_SECTIONS]; and #defines in the targets mapping the former global variables to indices in that array. All of this isn't "nice C++" of course, but well ... I'm not the one to insist ;) Richard. > > Segher