On Sun, 25 Jun 2023 at 04:18, Jan Hubicka <hubi...@ucw.cz> wrote:

> > Hi,
> Hi,
> I am sorry for late reaction.
>
No problem!

> > I am working on the GSOC project "Bypass Assembler when generating LTO
> > object files." So as a first step, I am adding .symtab along with
> > __gnu_lto_slim symbol into it so that at a later stage, it can be
> > recognized that this object file has been produced using -flto enabled.
> > This patch is regarding the same. Although I am still testing this
> patch, I
> > want general feedback on my code and design choice.
> > I have extended simple_object_wrtie_struct to hold a list of symbols (
> > similar to sections ). A function in simple-object.c to add symbols. I am
> > calling this function in lto-object.cc to add __gnu_lto_v1.
> > Right now, as we are only working on ELF support first, I am adding
> .symtab
> > in elf object files only.
> >
> > ---
> >  gcc/lto-object.cc                |   4 +-
> >  include/simple-object.h          |  10 +++
> >  libiberty/simple-object-common.h |  18 +++++
> >  libiberty/simple-object-elf.c    | 130 +++++++++++++++++++++++++++++--
> >  libiberty/simple-object.c        |  32 ++++++++
> >  5 files changed, 187 insertions(+), 7 deletions(-)
> >
> > diff --git a/gcc/lto-object.cc b/gcc/lto-object.cc
> > index cb1c3a6cfb3..680977cb327 100644
> > --- a/gcc/lto-object.cc
> > +++ b/gcc/lto-object.cc
> > @@ -187,7 +187,9 @@ lto_obj_file_close (lto_file *file)
> >        int err;
> >
> >        gcc_assert (lo->base.offset == 0);
> > -
> > +      /*Add __gnu_lto_slim symbol*/
> > +      if(flag_bypass_asm)
> > +        simple_object_write_add_symbol (lo->sobj_w,
> "__gnu_lto_slim",1,1);
>
> You can probably do this unconditionally.  The ltrans files we produce
> are kind of wrong by missing the symbol table currently.
>
  I see.

> > +simple_object_write_add_symbol(simple_object_write *sobj, const char
> *name,
> > +size_t size, unsigned int align);
>
> Symbols has much more properties in addition to sizes and alignments.
> We will eventually need to get dwarf writting, so we will need to
> support them. However right now we only do these fake lto object
> symbols, so perhaps for start we could kep things simple and assume that
> size is always 0 and align always 1 or so.
>
> Overall this looks like really good start to me (both API and
> imllementation looks reasonable to me and it is good that you follow the
> coding convention).  I guess you can create a branch (see git info on
> the gcc homepage) and put the patch there?
>
I can, but I don't have write access to git.  Also, for the next part, I am
thinking of properly configuring the driver
to directly produce an executable or adding debug info. What do you think?
--
Regards
Rishi

>
> I am also adding Ian to CC as he is maintainer of the simple-object and
> he may have some ideas.
>
> Honza
> >
> >  /* Release all resources associated with SIMPLE_OBJECT, including any
> >     simple_object_write_section's that may have been created.  */
> > diff --git a/libiberty/simple-object-common.h
> > b/libiberty/simple-object-common.h
> > index b9d10550d88..df99c9d85ac 100644
> > --- a/libiberty/simple-object-common.h
> > +++ b/libiberty/simple-object-common.h
> > @@ -58,6 +58,24 @@ struct simple_object_write_struct
> >    simple_object_write_section *last_section;
> >    /* Private data for the object file format.  */
> >    void *data;
> > +  /*The start of the list of symbols.*/
> > +  simple_object_symbol *symbols;
> > +  /*The last entry in the list of symbols*/
> > +  simple_object_symbol *last_symbol;
> > +};
> > +
> > +/*A symbol in object file being created*/
> > +struct simple_object_symbol_struct
> > +{
> > +  /*Next in the list of symbols attached to an
> > +  simple_object_write*/
> > +  simple_object_symbol *next;
> > +  /*The name of this symbol. */
> > +  char *name;
> > +  /* Symbol value */
> > +  unsigned int align;
> > +  /* Symbol size */
> > +  size_t size;
> >  };
> >
> >  /* A section in an object file being created.  */
> > diff --git a/libiberty/simple-object-elf.c
> b/libiberty/simple-object-elf.c
> > index eee07039984..cbba88186bd 100644
> > --- a/libiberty/simple-object-elf.c
> > +++ b/libiberty/simple-object-elf.c
> > @@ -787,9 +787,9 @@ simple_object_elf_write_ehdr (simple_object_write
> > *sobj, int descriptor,
> >      ++shnum;
> >    if (shnum > 0)
> >      {
> > -      /* Add a section header for the dummy section and one for
> > -     .shstrtab.  */
> > -      shnum += 2;
> > +      /* Add a section header for the dummy section,
> > +     .shstrtab, .symtab and .strtab.  */
> > +      shnum += 4;
> >      }
> >
> >    ehdr_size = (cl == ELFCLASS32
> > @@ -882,6 +882,51 @@ simple_object_elf_write_shdr (simple_object_write
> > *sobj, int descriptor,
> >                         errmsg, err);
> >  }
> >
> > +/* Write out an ELF Symbol*/
> > +
> > +static int
> > +simple_object_elf_write_symbol(simple_object_write *sobj, int
> descriptor,
> > +            off_t offset, unsigned int st_name, unsigned int st_value,
> > size_t st_size,
> > +            unsigned char st_info, unsigned char st_other, unsigned int
> > st_shndx,
> > +            const char **errmsg, int *err)
> > +{
> > +  struct simple_object_elf_attributes *attrs =
> > +    (struct simple_object_elf_attributes *) sobj->data;
> > +  const struct elf_type_functions* fns;
> > +  unsigned char cl;
> > +  size_t sym_size;
> > +  unsigned char buf[sizeof (Elf64_External_Shdr)];
> > +
> > +  fns = attrs->type_functions;
> > +  cl = attrs->ei_class;
> > +
> > +  sym_size = (cl == ELFCLASS32
> > +           ? sizeof (Elf32_External_Shdr)
> > +           : sizeof (Elf64_External_Shdr));
> > +  memset (buf, 0, sizeof (Elf64_External_Shdr));
> > +
> > +  if(cl==ELFCLASS32)
> > +  {
> > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_name, Elf_Word, st_name);
> > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_value, Elf_Addr, st_value);
> > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_size, Elf_Addr, st_size);
> > +    buf[4]=st_info;
> > +    buf[5]=st_other;
> > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_shndx, Elf_Half, st_shndx);
> > +  }
> > +  else
> > +  {
> > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_name, Elf_Word, st_name);
> > +    buf[4]=st_info;
> > +    buf[5]=st_other;
> > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_shndx, Elf_Half, st_shndx);
> > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_value, Elf_Addr, st_value);
> > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_size, Elf_Addr, st_size);
> > +  }
> > +  return simple_object_internal_write(descriptor, offset,buf,sym_size,
> > +              errmsg,err);
> > +}
> > +
> >  /* Write out a complete ELF file.
> >     Ehdr
> >     initial dummy Shdr
> > @@ -932,8 +977,8 @@ simple_object_elf_write_to_file (simple_object_write
> > *sobj, int descriptor,
> >    if (shnum == 0)
> >      return NULL;
> >
> > -  /* Add initial dummy Shdr and .shstrtab.  */
> > -  shnum += 2;
> > +  /* Add initial dummy Shdr, .shstrtab, .symtab and .strtab.  */
> > +  shnum += 4;
> >
> >    shdr_offset = ehdr_size;
> >    sh_offset = shdr_offset + shnum * shdr_size;
> > @@ -1036,6 +1081,70 @@ simple_object_elf_write_to_file
> (simple_object_write
> > *sobj, int descriptor,
> >        sh_offset += sh_size;
> >      }
> >
> > +  unsigned int num_sym=1;
> > +  simple_object_symbol *symbol;
> > +
> > +  for(symbol=sobj->symbols;symbol!=NULL;symbol=symbol->next)
> > +  {
> > +    ++num_sym;
> > +  }
> > +
> > +  size_t
> >
> sym_size=cl==ELFCLASS32?sizeof(Elf32_External_Sym):sizeof(Elf64_External_Sym);
> > +  size_t sh_addralign=cl==ELFCLASS32?0x04:0x08;
> > +  size_t sh_entsize=sym_size;
> > +  size_t sh_size=num_sym*sym_size;
> > +  unsigned int sh_info=2;
> > +  if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset,
> > +                     sh_name, SHT_SYMTAB, 0, 0, sh_offset,
> > +                     sh_size, shnum-2, sh_info,
> > +                     sh_addralign,sh_entsize, &errmsg, err))
> > +    return errmsg;
> > +  shdr_offset += shdr_size;
> > +  sh_name+=strlen(".symtab")+1;
> > +  /*Writes out the dummy symbol */
> > +
> > +  if(!simple_object_elf_write_symbol(sobj, descriptor, sh_offset,
> > +        0,0,0,0,0,SHN_UNDEF,&errmsg,err))
> > +    return errmsg;
> > +  sh_offset+=sym_size;
> > +  unsigned int st_name=1;
> > +  for(symbol=sobj->symbols;symbol!=NULL;symbol=symbol->next)
> > +  {
> > +    unsigned int st_value=1;
> > +    unsigned int st_size=1;
> > +    unsigned char st_info=17;
> > +    if(!simple_object_elf_write_symbol(sobj, descriptor, sh_offset,
> > +        st_name,st_value,st_size,st_info,0,SHN_COMMON,&errmsg,err))
> > +      return errmsg;
> > +    sh_offset+=sym_size;
> > +    st_name+=strlen(symbol->name)+1;
> > +
> > +  }
> > +
> > +  if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset,
> > +                     sh_name, SHT_STRTAB, 0, 0, sh_offset,
> > +                     st_name, 0, 0,
> > +                     1, 0, &errmsg, err))
> > +    return errmsg;
> > +  shdr_offset += shdr_size;
> > +  sh_name+=strlen(".strtab")+1;
> > +  /*.strtab has a leading zero byte*/
> > +  zero = 0;
> > +  if (!simple_object_internal_write (descriptor, sh_offset, &zero, 1,
> > +                     &errmsg, err))
> > +    return errmsg;
> > +  ++sh_offset;
> > +
> > +  for(symbol=sobj->symbols;symbol!=NULL;symbol=symbol->next)
> > +  {
> > +    size_t len=strlen(symbol->name)+1;
> > +    if (!simple_object_internal_write (descriptor, sh_offset,
> > +                     (const unsigned char *) symbol->name,
> > +                     len, &errmsg, err))
> > +    return errmsg;
> > +      sh_offset += len;
> > +
> > +  }
> >    if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset,
> >                       sh_name, SHT_STRTAB, 0, 0, sh_offset,
> >                       sh_name + strlen (".shstrtab") + 1, 0, 0,
> > @@ -1060,7 +1169,16 @@ simple_object_elf_write_to_file
> (simple_object_write
> > *sobj, int descriptor,
> >      return errmsg;
> >        sh_offset += len;
> >      }
> > -
> > +  if (!simple_object_internal_write (descriptor, sh_offset,
> > +                     (const unsigned char *) ".symtab",
> > +                     strlen (".symtab") + 1, &errmsg, err))
> > +    return errmsg;
> > +  sh_offset+=strlen(".symtab")+1;
> > +  if (!simple_object_internal_write (descriptor, sh_offset,
> > +                     (const unsigned char *) ".strtab",
> > +                     strlen (".strtab") + 1, &errmsg, err))
> > +    return errmsg;
> > +  sh_offset+=strlen(".strtab")+1;
> >    if (!simple_object_internal_write (descriptor, sh_offset,
> >                       (const unsigned char *) ".shstrtab",
> >                       strlen (".shstrtab") + 1, &errmsg, err))
> > diff --git a/libiberty/simple-object.c b/libiberty/simple-object.c
> > index 163e58a2f3b..73622160248 100644
> > --- a/libiberty/simple-object.c
> > +++ b/libiberty/simple-object.c
> > @@ -455,6 +455,8 @@ simple_object_start_write (simple_object_attributes
> > *attrs,
> >    ret->sections = NULL;
> >    ret->last_section = NULL;
> >    ret->data = data;
> > +  ret->symbols=NULL;
> > +  ret->last_symbol=NULL;
> >    return ret;
> >  }
> >
> > @@ -538,6 +540,28 @@ simple_object_write_to_file (simple_object_write
> > *sobj, int descriptor,
> >  {
> >    return sobj->functions->write_to_file (sobj, descriptor, err);
> >  }
> > +/*Adds a symbol in to common*/
> > +void
> > +simple_object_write_add_symbol(simple_object_write *sobj, const char
> *name,
> > +size_t size, unsigned int align)
> > +{
> > +  simple_object_symbol *symbol;
> > +  symbol=XNEW(simple_object_symbol);
> > +  symbol->next=NULL;
> > +  symbol->name=xstrdup(name);
> > +  symbol->align=align;
> > +  symbol->size=size;
> > +  if(sobj->last_symbol==NULL)
> > +  {
> > +    sobj->symbols=symbol;
> > +    sobj->last_symbol=symbol;
> > +  }
> > +  else
> > +  {
> > +    sobj->last_symbol->next=symbol;
> > +    sobj->last_symbol=symbol;
> > +  }
> > +}
> >
> >  /* Release an simple_object_write.  */
> >
> > @@ -571,6 +595,14 @@ simple_object_release_write (simple_object_write
> *sobj)
> >        XDELETE (section);
> >        section = next_section;
> >      }
> > +  simple_object_symbol *symbol;
> > +  symbol=sobj->symbols;
> > +  while(symbol!=NULL)
> > +  {
> > +    free(symbol->name);
> > +    XDELETE(symbol);
> > +    symbol=symbol->next;
> > +  }
> >
> >    sobj->functions->release_write (sobj->data);
> >    XDELETE (sobj);
> > --
> > 2.40.1
>

Reply via email to