From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 43735 invoked by alias); 5 Aug 2015 15:28:30 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 43643 invoked by uid 89); 5 Aug 2015 15:28:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.5 required=5.0 tests=AWL,BAYES_80,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=no version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 05 Aug 2015 15:28:22 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 4EAE72CD806; Wed, 5 Aug 2015 15:28:21 +0000 (UTC) Received: from [10.3.236.67] (vpn-236-67.phx2.redhat.com [10.3.236.67]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t75FSJmV026955; Wed, 5 Aug 2015 11:28:20 -0400 Message-ID: <1438788499.21752.39.camel@surprise> Subject: Re: [PATCH 4/4] define ASM_OUTPUT_LABEL to the name of a function From: David Malcolm To: Richard Biener Cc: Trevor Saunders , tbsaunde+gcc@tbsaunde.org, GCC Patches Date: Wed, 05 Aug 2015 15:28:00 -0000 In-Reply-To: References: <1437791820-17927-1-git-send-email-tbsaunde+gcc@tbsaunde.org> <1437791820-17927-5-git-send-email-tbsaunde+gcc@tbsaunde.org> <20150805105650.GA27755@tsaunders-iceball.corp.tor1.mozilla.com> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2015-08/txt/msg00294.txt.bz2 On Wed, 2015-08-05 at 13:47 +0200, Richard Biener wrote: > On Wed, Aug 5, 2015 at 12:57 PM, Trevor Saunders wrote: > > On Mon, Jul 27, 2015 at 11:06:58AM +0200, Richard Biener wrote: > >> On Sat, Jul 25, 2015 at 4:37 AM, wrote: > >> > From: Trevor Saunders > >> > > >> > * config/arc/arc.h, config/bfin/bfin.h, config/frv/frv.h, > >> > config/ia64/ia64-protos.h, config/ia64/ia64.c, config/ia64/ia64.h, > >> > config/lm32/lm32.h, config/mep/mep.h, config/mmix/mmix.h, > >> > config/rs6000/rs6000.c, config/rs6000/xcoff.h, config/spu/spu.h, > >> > config/visium/visium.h, defaults.h: Define ASM_OUTPUT_LABEL to > >> > the name of a function. > >> > * output.h (default_output_label): New prototype. > >> > * varasm.c (default_output_label): New function. > >> > * vmsdbgout.c: Include tm_p.h. > >> > * xcoffout.c: Likewise. > >> > >> Just a general remark - the GCC output machinery is known to be slow, > >> adding indirect calls might be not the very best idea without refactoring > >> some of it. > >> > >> Did you do any performance measurements for artificial testcases > >> exercising the specific bits you change? > > > > sorry about the delay, but I finally got a chance to do some perf tests > > of the first patch. I took three test cases fold-const.ii, insn-emit.ii > > and a random .i from firefox and did 3 trials of the length of 100 > > compilations. The only non default flag was -std=gnu++11. > > > > results before patch hookizing output_ascii > > > > fold-const.ii > > real 3m18.051s > > user 2m41.340s > > sys 0m36.544s > > real 3m18.141s > > user 2m42.236s > > sys 0m35.740s > > real 3m18.297s > > user 2m42.316s > > sys 0m35.804s > > > > insn-emit.ii > > real 9m58.229s > > user 8m26.960s > > sys 1m31.224s > > real 9m57.857s > > user 8m24.616s > > sys 1m33.072s > > real 9m57.922s > > user 8m25.232s > > sys 1m32.512s > > > > mozilla.ii > > real 8m5.732s > > user 6m44.888s > > sys 1m20.764s > > real 8m5.404s > > user 6m44.468s > > sys 1m20.856s > > real 7m59.197s > > user 6m39.632s > > sys 1m19.472s > > > > after patch > > > > fold-const.ii > > real 3m18.488s > > user 2m41.972s > > sys 0m36.388s > > real 3m18.215s > > user 2m41.640s > > sys 0m36.432s > > real 3m18.368s > > user 2m42.492s > > sys 0m35.720s > > > > insn-emit.ii > > real 10m4.700s > > user 8m32.536s > > sys 1m32.120s > > real 10m4.241s > > user 8m31.456s > > sys 1m32.728s > > real 10m4.515s > > user 8m32.056s > > sys 1m32.396s > > > > mozilla.ii > > real 7m58.018s > > user 6m38.008s > > sys 1m19.924s > > real 7m59.269s > > user 6m37.736s > > sys 1m21.448s > > real 7m58.254s > > user 6m37.828s > > sys 1m20.324s > > > > So, roughly that looks to me like a range from improving by .5% to > > regressing by 1%. I'm not sure what could cause an improvement, so I > > kind of wonder how valid these results are. > > Hmm, indeed. The speedup looks suspicious. > > > Another question is how one can refactor the output machinary to be > > faster. My first thought is to buffer text internally before calling > > stdio functions, but that seems like a giant job. > > stdio functions are already buffering, so I don't know either. > > But yes, going the libas route would improve things here, or for > example enhancing gas to be able to eat target binary data > without the need to encode it in printable characters... > > .raw_data number-of-bytes > > > Makes it quite unparsable to editors of course ... A middle-ground might be to do both: .raw_data number-of-bytes > Richard. > > > thanks! > > > > Trev > > > > far outside of noise, > >> > >> Richard. > >> > >> > --- > >> > gcc/config/arc/arc.h | 3 +-- > >> > gcc/config/bfin/bfin.h | 5 +---- > >> > gcc/config/frv/frv.h | 6 +----- > >> > gcc/config/ia64/ia64-protos.h | 1 + > >> > gcc/config/ia64/ia64.c | 11 +++++++++++ > >> > gcc/config/ia64/ia64.h | 8 +------- > >> > gcc/config/lm32/lm32.h | 3 +-- > >> > gcc/config/mep/mep.h | 8 +------- > >> > gcc/config/mmix/mmix.h | 3 +-- > >> > gcc/config/pa/pa-protos.h | 1 + > >> > gcc/config/pa/pa.c | 12 ++++++++++++ > >> > gcc/config/pa/pa.h | 9 +-------- > >> > gcc/config/rs6000/rs6000-protos.h | 1 + > >> > gcc/config/rs6000/rs6000.c | 8 ++++++++ > >> > gcc/config/rs6000/xcoff.h | 3 +-- > >> > gcc/config/spu/spu.h | 3 +-- > >> > gcc/config/visium/visium.h | 3 +-- > >> > gcc/defaults.h | 6 +----- > >> > gcc/output.h | 3 +++ > >> > gcc/varasm.c | 9 +++++++++ > >> > gcc/vmsdbgout.c | 1 + > >> > gcc/xcoffout.c | 1 + > >> > 22 files changed, 60 insertions(+), 48 deletions(-) > >> > > >> > diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h > >> > index d98cce1..d3747b9 100644 > >> > --- a/gcc/config/arc/arc.h > >> > +++ b/gcc/config/arc/arc.h > >> > @@ -1245,8 +1245,7 @@ do { \ > >> > > >> > /* This is how to output the definition of a user-level label named NAME, > >> > such as the label on a static function or variable NAME. */ > >> > -#define ASM_OUTPUT_LABEL(FILE, NAME) \ > >> > -do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0) > >> > +#define ASM_OUTPUT_LABEL default_output_label > >> > > >> > #define ASM_NAME_P(NAME) ( NAME[0]=='*') > >> > > >> > diff --git a/gcc/config/bfin/bfin.h b/gcc/config/bfin/bfin.h > >> > index 26ba7c2..08906aa 100644 > >> > --- a/gcc/config/bfin/bfin.h > >> > +++ b/gcc/config/bfin/bfin.h > >> > @@ -1044,10 +1044,7 @@ typedef enum directives { > >> > ASM_OUTPUT_LABEL(FILE, NAME); \ > >> > } while (0) > >> > > >> > -#define ASM_OUTPUT_LABEL(FILE, NAME) \ > >> > - do { assemble_name (FILE, NAME); \ > >> > - fputs (":\n",FILE); \ > >> > - } while (0) > >> > +#define ASM_OUTPUT_LABEL default_output_label > >> > > >> > #define ASM_OUTPUT_LABELREF(FILE,NAME) \ > >> > do { fprintf (FILE, "_%s", NAME); \ > >> > diff --git a/gcc/config/frv/frv.h b/gcc/config/frv/frv.h > >> > index b0d66fd..1d25974 100644 > >> > --- a/gcc/config/frv/frv.h > >> > +++ b/gcc/config/frv/frv.h > >> > @@ -1668,11 +1668,7 @@ do { \ > >> > `assemble_name (STREAM, NAME)' to output the name itself; before and after > >> > that, output the additional assembler syntax for defining the name, and a > >> > newline. */ > >> > -#define ASM_OUTPUT_LABEL(STREAM, NAME) \ > >> > -do { \ > >> > - assemble_name (STREAM, NAME); \ > >> > - fputs (":\n", STREAM); \ > >> > -} while (0) > >> > +#define ASM_OUTPUT_LABEL default_output_label > >> > > >> > /* Globalizing directive for a label. */ > >> > #define GLOBAL_ASM_OP "\t.globl " > >> > diff --git a/gcc/config/ia64/ia64-protos.h b/gcc/config/ia64/ia64-protos.h > >> > index 29fc714..8e540e4 100644 > >> > --- a/gcc/config/ia64/ia64-protos.h > >> > +++ b/gcc/config/ia64/ia64-protos.h > >> > @@ -72,6 +72,7 @@ extern rtx ia64_expand_builtin (tree, rtx, rtx, machine_mode, int); > >> > extern rtx ia64_va_arg (tree, tree); > >> > #endif /* RTX_CODE */ > >> > > >> > +extern void ia64_output_label (FILE *f, const char *label); > >> > extern void ia64_asm_output_external (FILE *, tree, const char *); > >> > extern void ia64_vms_output_aligned_decl_common (FILE *, tree, const char *, > >> > unsigned HOST_WIDE_INT, > >> > diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c > >> > index 779fc58..e07ebb5 100644 > >> > --- a/gcc/config/ia64/ia64.c > >> > +++ b/gcc/config/ia64/ia64.c > >> > @@ -10522,6 +10522,17 @@ ia64_hpux_function_arg_padding (machine_mode mode, const_tree type) > >> > return DEFAULT_FUNCTION_ARG_PADDING (mode, type); > >> > } > >> > > >> > +/* Assemble a label. */ > >> > + > >> > +void > >> > +ia64_output_label (FILE *f, const char *label) > >> > +{ > >> > + ia64_asm_output_label = 1; > >> > + assemble_name (f, label); > >> > + fputs (":\n", f); > >> > + ia64_asm_output_label = 0; > >> > +} > >> > + > >> > /* Emit text to declare externally defined variables and functions, because > >> > the Intel assembler does not support undefined externals. */ > >> > > >> > diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h > >> > index 4b62423..1afa7b7 100644 > >> > --- a/gcc/config/ia64/ia64.h > >> > +++ b/gcc/config/ia64/ia64.h > >> > @@ -1246,13 +1246,7 @@ do { \ > >> > why ia64_asm_output_label exists. */ > >> > > >> > extern int ia64_asm_output_label; > >> > -#define ASM_OUTPUT_LABEL(STREAM, NAME) \ > >> > -do { \ > >> > - ia64_asm_output_label = 1; \ > >> > - assemble_name (STREAM, NAME); \ > >> > - fputs (":\n", STREAM); \ > >> > - ia64_asm_output_label = 0; \ > >> > -} while (0) > >> > +#define ASM_OUTPUT_LABEL ia64_output_label > >> > > >> > /* Globalizing directive for a label. */ > >> > #define GLOBAL_ASM_OP "\t.global " > >> > diff --git a/gcc/config/lm32/lm32.h b/gcc/config/lm32/lm32.h > >> > index 986383f..9e8c667 100644 > >> > --- a/gcc/config/lm32/lm32.h > >> > +++ b/gcc/config/lm32/lm32.h > >> > @@ -443,8 +443,7 @@ do \ > >> > } \ > >> > while (0) > >> > > >> > -#define ASM_OUTPUT_LABEL(FILE, NAME) \ > >> > - do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0) > >> > +#define ASM_OUTPUT_LABEL default_output_label > >> > > >> > #define ASM_OUTPUT_LABELREF(FILE,NAME) \ > >> > do { \ > >> > diff --git a/gcc/config/mep/mep.h b/gcc/config/mep/mep.h > >> > index f7322cb7..8a9d447 100644 > >> > --- a/gcc/config/mep/mep.h > >> > +++ b/gcc/config/mep/mep.h > >> > @@ -625,13 +625,7 @@ typedef struct > >> > #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(STREAM, DECL, NAME, SIZE, ALIGNMENT) \ > >> > mep_output_aligned_common (STREAM, DECL, NAME, SIZE, ALIGNMENT, 0) > >> > > >> > -#define ASM_OUTPUT_LABEL(STREAM, NAME) \ > >> > - do \ > >> > - { \ > >> > - assemble_name (STREAM, NAME); \ > >> > - fputs (":\n", STREAM); \ > >> > - } \ > >> > - while (0) > >> > +#define ASM_OUTPUT_LABEL default_output_label > >> > > >> > /* Globalizing directive for a label. */ > >> > #define GLOBAL_ASM_OP "\t.globl " > >> > diff --git a/gcc/config/mmix/mmix.h b/gcc/config/mmix/mmix.h > >> > index 29d39bc..aac5aa0 100644 > >> > --- a/gcc/config/mmix/mmix.h > >> > +++ b/gcc/config/mmix/mmix.h > >> > @@ -647,8 +647,7 @@ typedef struct { int regs; int lib; } CUMULATIVE_ARGS; > >> > > >> > /* Node: Label Output */ > >> > > >> > -#define ASM_OUTPUT_LABEL(STREAM, NAME) \ > >> > - mmix_asm_output_label (STREAM, NAME) > >> > +#define ASM_OUTPUT_LABEL mmix_asm_output_label > >> > > >> > #define ASM_OUTPUT_INTERNAL_LABEL(STREAM, NAME) \ > >> > mmix_asm_output_internal_label (STREAM, NAME) > >> > diff --git a/gcc/config/pa/pa-protos.h b/gcc/config/pa/pa-protos.h > >> > index 0e13cd5..46a3e3b 100644 > >> > --- a/gcc/config/pa/pa-protos.h > >> > +++ b/gcc/config/pa/pa-protos.h > >> > @@ -110,6 +110,7 @@ extern void pa_asm_output_aligned_common (FILE *, const char *, > >> > extern void pa_asm_output_aligned_local (FILE *, const char *, > >> > unsigned HOST_WIDE_INT, > >> > unsigned int); > >> > +extern void pa_output_label (FILE *f, const char *label); > >> > extern void pa_hpux_asm_output_external (FILE *, tree, const char *); > >> > extern bool pa_cannot_change_mode_class (machine_mode, machine_mode, > >> > enum reg_class); > >> > diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c > >> > index b24413a..2bcaa7e 100644 > >> > --- a/gcc/config/pa/pa.c > >> > +++ b/gcc/config/pa/pa.c > >> > @@ -9761,6 +9761,18 @@ pa_reloc_rw_mask (void) > >> > return 3; > >> > } > >> > > >> > +/* Assemble a lable. */ > >> > + > >> > +void > >> > +pa_output_label (FILE *f, const char *label) > >> > +{ > >> > + assemble_name (f, label); > >> > + if (TARGET_GAS) > >> > + fputs (":\n", f); > >> > + else > >> > + fputc ('\n', (f)); > >> > +} > >> > + > >> > static void > >> > pa_globalize_label (FILE *stream, const char *name) > >> > { > >> > diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h > >> > index bdfbb16..595a10b 100644 > >> > --- a/gcc/config/pa/pa.h > >> > +++ b/gcc/config/pa/pa.h > >> > @@ -1107,14 +1107,7 @@ do { \ > >> > /* This is how to output the definition of a user-level label named NAME, > >> > such as the label on a static function or variable NAME. */ > >> > > >> > -#define ASM_OUTPUT_LABEL(FILE,NAME) \ > >> > - do { \ > >> > - assemble_name ((FILE), (NAME)); \ > >> > - if (TARGET_GAS) \ > >> > - fputs (":\n", (FILE)); \ > >> > - else \ > >> > - fputc ('\n', (FILE)); \ > >> > - } while (0) > >> > +#define ASM_OUTPUT_LABEL pa_output_label > >> > > >> > /* This is how to output a reference to a user-level label named NAME. > >> > `assemble_name' uses this. */ > >> > diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h > >> > index 560a825..031614f 100644 > >> > --- a/gcc/config/rs6000/rs6000-protos.h > >> > +++ b/gcc/config/rs6000/rs6000-protos.h > >> > @@ -169,6 +169,7 @@ extern int function_ok_for_sibcall (tree); > >> > extern int rs6000_reg_parm_stack_space (tree, bool); > >> > extern void rs6000_xcoff_declare_function_name (FILE *, const char *, tree); > >> > extern void rs6000_xcoff_declare_object_name (FILE *, const char *, tree); > >> > +extern void rs6000_xcoff_output_label (FILE *f, const char *label); > >> > extern void rs6000_elf_declare_function_name (FILE *, const char *, tree); > >> > extern bool rs6000_elf_in_small_data_p (const_tree); > >> > #ifdef ARGS_SIZE_RTX > >> > diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > >> > index c8794b4..a214010 100644 > >> > --- a/gcc/config/rs6000/rs6000.c > >> > +++ b/gcc/config/rs6000/rs6000.c > >> > @@ -30364,6 +30364,14 @@ rs6000_xcoff_asm_output_anchor (rtx symbol) > >> > fprintf (asm_out_file, "\n"); > >> > } > >> > > >> > +/* Assemble the given label. */ > >> > +void > >> > +rs6000_xcoff_output_label (FILE *f, const char *label) > >> > +{ > >> > + RS6000_OUTPUT_BASENAME (f, label); > >> > + fputs (":\n", f); > >> > +} > >> > + > >> > static void > >> > rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name) > >> > { > >> > diff --git a/gcc/config/rs6000/xcoff.h b/gcc/config/rs6000/xcoff.h > >> > index 8b0cb27..263e239 100644 > >> > --- a/gcc/config/rs6000/xcoff.h > >> > +++ b/gcc/config/rs6000/xcoff.h > >> > @@ -119,8 +119,7 @@ > >> > /* This is how to output the definition of a user-level label named NAME, > >> > such as the label on a static function or variable NAME. */ > >> > > >> > -#define ASM_OUTPUT_LABEL(FILE,NAME) \ > >> > - do { RS6000_OUTPUT_BASENAME (FILE, NAME); fputs (":\n", FILE); } while (0) > >> > +#define ASM_OUTPUT_LABEL rs6000_xcoff_output_label > >> > > >> > /* This is how to output a command to make the user-level label named NAME > >> > defined for reference from other files. */ > >> > diff --git a/gcc/config/spu/spu.h b/gcc/config/spu/spu.h > >> > index 25fa435..f35b55e 100644 > >> > --- a/gcc/config/spu/spu.h > >> > +++ b/gcc/config/spu/spu.h > >> > @@ -443,8 +443,7 @@ do { \ > >> > > >> > > >> > /* Label Output */ > >> > -#define ASM_OUTPUT_LABEL(FILE,NAME) \ > >> > - do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0) > >> > +#define ASM_OUTPUT_LABEL default_output_label > >> > > >> > #define ASM_OUTPUT_LABELREF(FILE, NAME) \ > >> > asm_fprintf (FILE, "%U%s", default_strip_name_encoding (NAME)) > >> > diff --git a/gcc/config/visium/visium.h b/gcc/config/visium/visium.h > >> > index a2ab61c..6457c55 100644 > >> > --- a/gcc/config/visium/visium.h > >> > +++ b/gcc/config/visium/visium.h > >> > @@ -1440,8 +1440,7 @@ do \ > >> > `assemble_name (STREAM, NAME)' to output the name itself; before > >> > and after that, output the additional assembler syntax for defining > >> > the name, and a newline. */ > >> > -#define ASM_OUTPUT_LABEL(STREAM,NAME) \ > >> > - do { assemble_name (STREAM, NAME); fputs (":\n", STREAM); } while (0) > >> > +#define ASM_OUTPUT_LABEL default_output_label > >> > > >> > /* Globalizing directive for a label */ > >> > #define GLOBAL_ASM_OP "\t.global " > >> > diff --git a/gcc/defaults.h b/gcc/defaults.h > >> > index 3ecf9fd..b1465de 100644 > >> > --- a/gcc/defaults.h > >> > +++ b/gcc/defaults.h > >> > @@ -89,11 +89,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see > >> > NAME, such as the label on variable NAME. */ > >> > > >> > #ifndef ASM_OUTPUT_LABEL > >> > -#define ASM_OUTPUT_LABEL(FILE,NAME) \ > >> > - do { \ > >> > - assemble_name ((FILE), (NAME)); \ > >> > - fputs (":\n", (FILE)); \ > >> > - } while (0) > >> > +#define ASM_OUTPUT_LABEL default_output_label > >> > #endif > >> > > >> > /* This is how to output the definition of a user-level label named > >> > diff --git a/gcc/output.h b/gcc/output.h > >> > index 8aa648a..07172d5 100644 > >> > --- a/gcc/output.h > >> > +++ b/gcc/output.h > >> > @@ -246,6 +246,9 @@ extern void assemble_name_raw (FILE *, const char *); > >> > be marked as referenced. */ > >> > extern void assemble_name (FILE *, const char *); > >> > > >> > +/* Assemble a label. */ > >> > +extern void default_output_label (FILE *f, const char *label); > >> > + > >> > /* Return the assembler directive for creating a given kind of integer > >> > object. SIZE is the number of bytes in the object and ALIGNED_P > >> > indicates whether it is known to be aligned. Return NULL if the > >> > diff --git a/gcc/varasm.c b/gcc/varasm.c > >> > index c2bfbf0..9c5f12d 100644 > >> > --- a/gcc/varasm.c > >> > +++ b/gcc/varasm.c > >> > @@ -2580,6 +2580,15 @@ assemble_name (FILE *file, const char *name) > >> > assemble_name_raw (file, name); > >> > } > >> > > >> > +/* Assemble a label. */ > >> > + > >> > +void > >> > +default_output_label (FILE *f, const char *label) > >> > +{ > >> > + assemble_name (f, label); > >> > + fputs (":\n", f); > >> > +} > >> > + > >> > /* Allocate SIZE bytes writable static space with a gensym name > >> > and return an RTX to refer to its address. */ > >> > > >> > diff --git a/gcc/vmsdbgout.c b/gcc/vmsdbgout.c > >> > index 0204740..d04b8fb 100644 > >> > --- a/gcc/vmsdbgout.c > >> > +++ b/gcc/vmsdbgout.c > >> > @@ -37,6 +37,7 @@ along with GCC; see the file COPYING3. If not see > >> > #include "langhooks.h" > >> > #include "function.h" > >> > #include "target.h" > >> > +#include "tm_p.h" > >> > > >> > /* Difference in seconds between the VMS Epoch and the Unix Epoch */ > >> > static const long long vms_epoch_offset = 3506716800ll; > >> > diff --git a/gcc/xcoffout.c b/gcc/xcoffout.c > >> > index 0f11115..83959c8 100644 > >> > --- a/gcc/xcoffout.c > >> > +++ b/gcc/xcoffout.c > >> > @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see > >> > #include "output.h" > >> > #include "target.h" > >> > #include "debug.h" > >> > +#include "tm_p.h" > >> > > >> > #ifdef XCOFF_DEBUGGING_INFO > >> > > >> > -- > >> > 2.4.0 > >> >