public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: Iain Sandoe <iains.gcc@gmail.com>
To: Ankur Saini <arsenic.secondary@gmail.com>
Cc: GCC Development <gcc@gcc.gnu.org>, hubicka@kam.mff.cuni.cz
Subject: Re: Updating patch regarding bypassing assembler when generating LTO object files
Date: Sun, 8 May 2022 15:40:17 +0100	[thread overview]
Message-ID: <C6361E8B-D488-4FD7-8BCD-224D83D970DB@gmail.com> (raw)
In-Reply-To: <AEC0A7FA-E1F8-4C57-A7DC-4FC912606BCB@gmail.com>

Hi Ankur,

> On 8 May 2022, at 15:29, Ankur Saini via Gcc <gcc@gcc.gnu.org> wrote:
> 

> I have been fiddling around with the patch regarding "bypassing assmebler
> while generating slim lto files" and managed to make it build with the
> current trunk. Though the patch seems to be working on Linux machine, it
> causes an ICE on macOS (it crashes in langhooks.cc while executing
> `lhd_begin_section ()`).

This is probably because Darwin (macOS) switches to a secondary output
when emitting LTO already, you will probably need to account for that in
the changes.

see gcc/config/darwin.cc: darwin_asm_lto_start() etc.

Iain

> 
> here is the patch ( not fully tested and is still a prototype ), I
> basically mimicked the entire previous patch (
> https://gcc.gnu.org/legacy-ml/gcc/2014-09/msg00340.html ) but on current
> source.
> 
> - Ankur
> 
> --- 
> 
> From e5d72a73962c34dcd818c17d440eb98ddd94e624 Mon Sep 17 00:00:00 2001
> From: Ankur Saini <arsenic@sourceware.org>
> Date: Sun, 8 May 2022 07:03:51 +0530
> Subject: [PATCH] bypass-asm prototype: 1
> 
> ---
> gcc/Makefile.in             |  1 +
> gcc/common.opt              |  3 +++
> gcc/langhooks.cc            | 29 +++++++++++++++++++++++++++-
> gcc/{lto => }/lto-object.cc | 29 +++++++++++++++++++++-------
> gcc/lto-streamer.h          | 35 ++++++++++++++++++++++++++++++++++
> gcc/lto/Make-lang.in        |  4 ++--
> gcc/lto/lto-common.cc       |  3 ++-
> gcc/lto/lto-lang.cc         |  1 +
> gcc/lto/lto.h               | 38 -------------------------------------
> gcc/toplev.cc               | 19 ++++++++++++++++---
> 10 files changed, 110 insertions(+), 52 deletions(-)
> rename gcc/{lto => }/lto-object.cc (94%)
> 
> diff --git a/gcc/Makefile.in b/gcc/Makefile.in
> index 31ff95500c9..3d1241d5819 100644
> --- a/gcc/Makefile.in
> +++ b/gcc/Makefile.in
> @@ -1509,6 +1509,7 @@ OBJS = \
> 	lto-section-out.o \
> 	lto-opts.o \
> 	lto-compress.o \
> +	lto-object.o \
> 	mcf.o \
> 	mode-switching.o \
> 	modulo-sched.o \
> diff --git a/gcc/common.opt b/gcc/common.opt
> index 8a0dafc522d..6348197380d 100644
> --- a/gcc/common.opt
> +++ b/gcc/common.opt
> @@ -1158,6 +1158,9 @@ fbtr-bb-exclusive
> Common Ignore
> Does nothing.  Preserved for backward compatibility.
> 
> +fbypass-asm=
> +Common Joined Var(flag_bypass_asm)
> +
> fcallgraph-info
> Common RejectNegative Var(flag_callgraph_info) Init(NO_CALLGRAPH_INFO);
> Output callgraph information on a per-file basis.
> diff --git a/gcc/langhooks.cc b/gcc/langhooks.cc
> index df970678a08..abfab7a27e0 100644
> --- a/gcc/langhooks.cc
> +++ b/gcc/langhooks.cc
> @@ -38,6 +38,10 @@ along with GCC; see the file COPYING3.  If not see
> #include "stor-layout.h"
> #include "cgraph.h"
> #include "debug.h"
> +#include "function.h"
> +#include "basic-block.h"
> +#include "gimple.h"
> +#include "lto-streamer.h"
> 
> /* Do nothing; in many cases the default hook.  */
> 
> @@ -820,6 +824,19 @@ lhd_begin_section (const char *name)
> {
>   section *section;
> 
> +  if (flag_bypass_asm)
> +    {
> +      static int initialized = false;
> +      if (!initialized)
> +	{
> +	  gcc_assert (asm_out_file == NULL);
> +          lto_set_current_out_file (lto_obj_file_open (asm_file_name, true));
> +	  initialized = true;
> +	}
> +      lto_obj_begin_section (name);
> +      return;
> +    }
> +
>   /* Save the old section so we can restore it in lto_end_asm_section.  */
>   gcc_assert (!saved_section);
>   saved_section = in_section;
> @@ -836,8 +853,13 @@ lhd_begin_section (const char *name)
>    implementation just calls assemble_string.  */
> 
> void
> -lhd_append_data (const void *data, size_t len, void *)
> +lhd_append_data (const void *data, size_t len, void *v)
> {
> +  if (flag_bypass_asm)
> +    {
> +      lto_obj_append_data (data, len, v);
> +      return;
> +    }
>   if (data)
>     {
>       timevar_push (TV_IPA_LTO_OUTPUT);
> @@ -854,6 +876,11 @@ lhd_append_data (const void *data, size_t len, void *)
> void
> lhd_end_section (void)
> {
> +  if (flag_bypass_asm)
> +    {
> +      lto_obj_end_section ();
> +      return;
> +    }
>   if (saved_section)
>     {
>       switch_to_section (saved_section);
> diff --git a/gcc/lto/lto-object.cc b/gcc/lto-object.cc
> similarity index 94%
> rename from gcc/lto/lto-object.cc
> rename to gcc/lto-object.cc
> index 329bbc71fd6..8ccc917a4eb 100644
> --- a/gcc/lto/lto-object.cc
> +++ b/gcc/lto-object.cc
> @@ -21,9 +21,17 @@ along with GCC; see the file COPYING3.  If not see
> #include "config.h"
> #include "system.h"
> #include "coretypes.h"
> -#include "tm.h"
> +#include "tree.h"
> +#include "basic-block.h"
> +#include "tree-ssa-alias.h"
> +#include "internal-fn.h"
> +#include "gimple-expr.h"
> +#include "is-a.h"
> +#include "function.h"
> +#include "gimple.h"
> #include "diagnostic-core.h"
> -#include "lto.h"
> +#include "tm.h"
> +#include "lto-streamer.h"
> #include "lto-section-names.h"
> #include "simple-object.h"
> 
> @@ -133,7 +141,13 @@ lto_obj_file_open (const char *filename, bool writable)
>     }
>   else
>     {
> -      gcc_assert (saved_attributes != NULL);
> +      if (!saved_attributes)
> +        {
> +          lto_file *tmp = lto_obj_file_open (flag_bypass_asm, false);
> +          if (!tmp)
> +            goto fail;
> +          lto_obj_file_close (tmp);
> +        }
>       lo->sobj_w = simple_object_start_write (saved_attributes,
> 					      LTO_SEGMENT_NAME,
> 					      &errmsg, &err);
> @@ -148,7 +162,8 @@ fail_errmsg:
>     error ("%s: %s", fname, errmsg);
>   else
>     error ("%s: %s: %s", fname, errmsg, xstrerror (err));
> -					 
> +
> +fail:
>   if (lo->fd != -1)
>     lto_obj_file_close ((lto_file *) lo);
>   free (lo);
> @@ -255,15 +270,15 @@ lto_obj_add_section (void *data, const char *name, off_t offset,
>    the start and size of each section in the .o file.  */
> 
> htab_t
> -lto_obj_build_section_table (lto_file *lto_file, struct lto_section_list *list)
> +lto_obj_build_section_table (lto_file *lto_file, struct lto_section_list *list,
> +                             htab_t section_hash_table)
> {
>   struct lto_simple_object *lo = (struct lto_simple_object *) lto_file;
> -  htab_t section_hash_table;
> +
>   struct lto_obj_add_section_data loasd;
>   const char *errmsg;
>   int err;
> 
> -  section_hash_table = lto_obj_create_section_hash_table ();
> 
>   gcc_assert (lo->sobj_r != NULL && lo->sobj_w == NULL);
>   loasd.section_hash_table = section_hash_table;
> diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
> index 597e9e405ec..4556583a6a8 100644
> --- a/gcc/lto-streamer.h
> +++ b/gcc/lto-streamer.h
> @@ -759,6 +759,30 @@ public:
>   lto_location_cache location_cache;
> };
> 
> +/* Hash table entry to hold the start offset and length of an LTO
> +   section in a .o file.  */
> +struct lto_section_slot
> +{
> +  const char *name;
> +  intptr_t start;
> +  size_t len;
> +  struct lto_section_slot *next;
> +};
> +
> +/* A list of section slots */
> +struct lto_section_list
> +{
> +  struct lto_section_slot *first, *last;
> +};
> +
> +/* A file.  */
> +struct lto_file
> +{
> +  /* The name of the file.  */
> +  const char *filename;
> +  /* The offset for the object inside an ar archive file (or zero).  */
> +  off_t offset;
> +};
> 
> /* In lto-section-in.cc  */
> extern class lto_input_block * lto_create_simple_input_block (
> @@ -898,6 +922,17 @@ void lto_output_location_and_block (struct output_block *, struct bitpack_d *,
> void lto_output_init_mode_table (void);
> void lto_prepare_function_for_streaming (cgraph_node *);
> 
> +/* In lto-elf.c or lto-coff.c  */
> +extern lto_file *lto_obj_file_open (const char *filename, bool writable);
> +extern void lto_obj_file_close (lto_file *file);
> +struct lto_section_list;
> +extern htab_t lto_obj_build_section_table (lto_file *file, struct lto_section_list *list, htab_t section_hash_table);
> +extern htab_t lto_obj_create_section_hash_table (void);
> +extern void lto_obj_begin_section (const char *name);
> +extern void lto_obj_append_data (const void *data, size_t len, void *block);
> +extern void lto_obj_end_section (void);
> +extern lto_file *lto_set_current_out_file (lto_file *file);
> +extern lto_file *lto_get_current_out_file (void);
> 
> /* In lto-cgraph.cc  */
> extern bool asm_nodes_output;
> diff --git a/gcc/lto/Make-lang.in b/gcc/lto/Make-lang.in
> index a2dcf0dfc12..41a822a317e 100644
> --- a/gcc/lto/Make-lang.in
> +++ b/gcc/lto/Make-lang.in
> @@ -24,9 +24,9 @@ LTO_EXE = lto1$(exeext)
> LTO_DUMP_EXE = lto-dump$(exeext)
> LTO_DUMP_INSTALL_NAME := $(shell echo lto-dump|sed '$(program_transform_name)')
> # The LTO-specific object files inclued in $(LTO_EXE).
> -LTO_OBJS = lto/lto-lang.o lto/lto.o lto/lto-object.o attribs.o lto/lto-partition.o lto/lto-symtab.o lto/lto-common.o
> +LTO_OBJS = lto/lto-lang.o lto/lto.o attribs.o lto/lto-partition.o lto/lto-symtab.o lto/lto-common.o
> lto_OBJS = $(LTO_OBJS)
> -LTO_DUMP_OBJS = lto/lto-lang.o lto/lto-object.o attribs.o lto/lto-partition.o lto/lto-symtab.o lto/lto-dump.o lto/lto-common.o
> +LTO_DUMP_OBJS = lto/lto-lang.o attribs.o lto/lto-partition.o lto/lto-symtab.o lto/lto-dump.o lto/lto-common.o
> lto_dump_OBJS = $(LTO_DUMP_OBJS)
> 
> # this is only useful in a LTO bootstrap, but this does not work right
> diff --git a/gcc/lto/lto-common.cc b/gcc/lto/lto-common.cc
> index ca28586a1e8..4a0c58cdbcd 100644
> --- a/gcc/lto/lto-common.cc
> +++ b/gcc/lto/lto-common.cc
> @@ -2306,7 +2306,8 @@ lto_file_read (lto_file *file, FILE *resolution_file, int *count)
>   struct lto_section_list section_list;
> 
>   memset (&section_list, 0, sizeof (struct lto_section_list));
> -  section_hash_table = lto_obj_build_section_table (file, &section_list);
> +  section_hash_table = lto_obj_create_section_hash_table ();
> +  section_hash_table = lto_obj_build_section_table (file, &section_list, section_hash_table);
> 
>   /* Dump the details of LTO objects.  */
>   if (flag_lto_dump_objects)
> diff --git a/gcc/lto/lto-lang.cc b/gcc/lto/lto-lang.cc
> index 8d58d924dff..64446fc9085 100644
> --- a/gcc/lto/lto-lang.cc
> +++ b/gcc/lto/lto-lang.cc
> @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3.  If not see
> #include "lto-tree.h"
> #include "lto.h"
> #include "lto-common.h"
> +#include "lto-streamer.h"
> #include "stringpool.h"
> #include "attribs.h"
> 
> diff --git a/gcc/lto/lto.h b/gcc/lto/lto.h
> index 9f7fae95bc4..bb0a2852250 100644
> --- a/gcc/lto/lto.h
> +++ b/gcc/lto/lto.h
> @@ -21,16 +21,6 @@ along with GCC; see the file COPYING3.  If not see
> #ifndef LTO_H
> #define LTO_H
> 
> -
> -/* A file.  */
> -struct lto_file
> -{
> -  /* The name of the file.  */
> -  const char *filename;
> -  /* The offset for the object inside an ar archive file (or zero).  */
> -  off_t offset;
> -};
> -
> /* In lto-lang.cc  */
> extern const char *resolution_file_name;
> 
> @@ -39,36 +29,8 @@ extern tree lto_eh_personality (void);
> extern void lto_main (void);
> extern void lto_read_all_file_options (void);
> 
> -/* In lto-elf.c or lto-coff.c  */
> -extern lto_file *lto_obj_file_open (const char *filename, bool writable);
> -extern void lto_obj_file_close (lto_file *file);
> -struct lto_section_list;
> -extern htab_t lto_obj_build_section_table (lto_file *file, struct lto_section_list *list);
> -extern htab_t lto_obj_create_section_hash_table (void);
> -extern void lto_obj_begin_section (const char *name);
> -extern void lto_obj_append_data (const void *data, size_t len, void *block);
> -extern void lto_obj_end_section (void);
> -extern lto_file *lto_set_current_out_file (lto_file *file);
> -extern lto_file *lto_get_current_out_file (void);
> -
> extern int lto_link_dump_id, decl_merge_dump_id, partition_dump_id;
> 
> -/* Hash table entry to hold the start offset and length of an LTO
> -   section in a .o file.  */
> -struct lto_section_slot
> -{
> -  const char *name;
> -  intptr_t start;
> -  size_t len;
> -  struct lto_section_slot *next;
> -};
> -
> -/* A list of section slots */
> -struct lto_section_list
> -{
> -  struct lto_section_slot *first, *last;
> -};
> -
> extern unsigned int lto_option_lang_mask (void);
> 
> #endif /* LTO_H */
> diff --git a/gcc/toplev.cc b/gcc/toplev.cc
> index ed546b2cad8..4464c5d6773 100644
> --- a/gcc/toplev.cc
> +++ b/gcc/toplev.cc
> @@ -88,6 +88,7 @@ along with GCC; see the file COPYING3.  If not see
> #include "ipa-modref.h"
> #include "ipa-param-manipulation.h"
> #include "dbgcnt.h"
> +#include "lto-streamer.h"
> 
> #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
> #include "dbxout.h"
> @@ -547,6 +548,12 @@ compile_file (void)
>      even when user did not ask for it.  */
>   if (flag_generate_lto && !flag_fat_lto_objects)
>     {
> +      if (flag_bypass_asm)
> +        {
> +          /* TODO  */
> +        }
> +      else
> +        {
> #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
>       ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE, "__gnu_lto_slim",
> 				      HOST_WIDE_INT_1U, 8);
> @@ -558,12 +565,13 @@ compile_file (void)
> 			 HOST_WIDE_INT_1U,
> 			 HOST_WIDE_INT_1U);
> #endif
> +        }
>     }
> 
>   /* Attach a special .ident directive to the end of the file to identify
>      the version of GCC which compiled this code.  The format of the .ident
>      string is patterned after the ones produced by native SVR4 compilers.  */
> -  if (!flag_no_ident)
> +  if (!flag_no_ident && !flag_bypass_asm)
>     {
>       const char *pkg_version = "(GNU) ";
>       char *ident_str;
> @@ -585,7 +593,11 @@ compile_file (void)
>   /* This must be at the end.  Some target ports emit end of file directives
>      into the assembly file here, and hence we cannot output anything to the
>      assembly file after this point.  */
> -  targetm.asm_out.file_end ();
> +
> +  if (flag_bypass_asm)
> +    lto_obj_file_close (lto_get_current_out_file ());
> +  else
> +    targetm.asm_out.file_end ();
> 
>   timevar_stop (TV_PHASE_LATE_ASM);
> }
> @@ -1861,7 +1873,8 @@ lang_dependent_init (const char *name)
> 
>   if (!flag_wpa)
>     {
> -      init_asm_output (name);
> +      if (!flag_bypass_asm)
> +        init_asm_output (name);
> 
>       if (!flag_generate_lto && !flag_compare_debug)
> 	{
> -- 
> 2.35.0
> 
> 


      reply	other threads:[~2022-05-08 14:40 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-08 14:29 Ankur Saini
2022-05-08 14:40 ` Iain Sandoe [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=C6361E8B-D488-4FD7-8BCD-224D83D970DB@gmail.com \
    --to=iains.gcc@gmail.com \
    --cc=arsenic.secondary@gmail.com \
    --cc=gcc@gcc.gnu.org \
    --cc=hubicka@kam.mff.cuni.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).