Hello,

In a perfect world, front ends would not be writing out anything to
the assembler output. GCC is not part of this perfect world, at least
not yet. It should be possible, with a little help from front-end
maintainers, especially for Ada and ObjC and someone knowledgeable of
PCH, to enforce a rule that a front end must not #include output.h.

A part of the compiler that writes to the assembler output has to
include output.h or use one of the functions prototyped there.
Therefore I have tried to remove #includes of output.h last week. I am
stuck on 9 files that still have to include output.h for the following
symbols:

1. assemble_string
2. get_section
3. switch_to_section
4. have_global_bss_p
5. first_global_object_name
6. asm_out_file

The uses of these symbols are in the following files:

assemble_string / get_section / switch_to_section:
go/go-backend.c:  assemble_string (bytes, size);
go/go-backend.c:      sec = get_section (GO_EXPORT_SECTION_NAME,
SECTION_DEBUG, NULL);
go/go-backend.c:  switch_to_section (sec);
java/class.c:     switch_to_section (get_section (buf, flags, NULL));
java/class.c:     switch_to_section (get_section (buf, flags, NULL));

I am not sure how to fix this. I think it could be fixed by having a
version of build_constant_desc that puts the data in a specific
section while wrapping up global variables in varasm. The above code
means that these front ends do not work (and maybe are not supposed to
work) with LTO. That is something that IMHO should be documented
somewhere.


have_global_bss_p:
cp/decl.c:      && !have_global_bss_p ())
ada/gcc-interface/utils.c:      && !have_global_bss_p ())

I don't even know what this is. Help welcome. :-)


first_global_object_name:
ada/gcc-interface/trans.c:  first_global_object_name = ggc_strdup
(IDENTIFIER_POINTER (t));
ada/gcc-interface/utils.c:      ASM_FORMAT_PRIVATE_NAME (label,
first_global_object_name, 0);

This comes from here:

  /* Declare the name of the compilation unit as the first global
     name in order to make the middle-end fully deterministic.  */
  t = create_concat_name (Defining_Entity (Unit (gnat_root)), NULL);
  first_global_object_name = ggc_strdup (IDENTIFIER_POINTER (t));

Only the Ada front end has code like this. The other front ends set
first_global_object_name via notice_global_symbol (which is called
from varpool_finalize_decl and a few other places). It seems like a
good idea to me, to make first_global_object_name deterministic.
Perhaps it should be set to the top level translation unit by all
front ends? That would also simplify notice_global_symbol and prevent
it from accessing/creating DECL_RTL early.


user_label_prefix:
c-family/c-cppbuiltin.c:  builtin_define_with_value
("__USER_LABEL_PREFIX__", user_label_prefix, 0);

Because user_label_prefix is defined in toplev.c, I think its global
decl should be moved from output.h to toplev.h.


asm_out_file for ASM_OUTPUT_IDENT:
c-family/c-lex.c:#include "output.h" /* for asm_out_file */
c-family/c-lex.c:         ASM_OUTPUT_IDENT (asm_out_file, (const char
*) cstr.text);
ada/gcc-interface/trans.c:      (asm_out_file,

I am not sure how to fix this. Maybe also write this out via a version
of build_constant_desc that puts the data in a specific section (that
would be required for MIPS' version of ASM_OUTPUT_IDENT).


asm_out_file for PCH:
c-family/c-pch.c:#include "output.h" /* for asm_out_file */
c-family/c-pch.c:      fprintf (asm_out_file, "%s ", ASM_COMMENT_START);
c-family/c-pch.c:      c_common_print_pch_checksum (asm_out_file);
c-family/c-pch.c:      fputc ('\n', asm_out_file);
c-family/c-pch.c:  asm_file_startpos = ftell (asm_out_file);
c-family/c-pch.c:  asm_file_end = ftell (asm_out_file);
c-family/c-pch.c:  if (fseek (asm_out_file, asm_file_startpos, SEEK_SET) != 0)
c-family/c-pch.c:      if (fread (buf, size, 1, asm_out_file) != 1)
c-family/c-pch.c:  if (fseek (asm_out_file, 0, SEEK_END) != 0)
c-family/c-pch.c:             || fwrite (buf, size, 1, asm_out_file) != 1)
c-family/c-pch.c:        asm_out_file.  */

I do not understand this at all. In what way does PCH have anything to
do with writing out to asm_out_file?!


asm_out_file for NEXT runtime ABI v01:
objc/objc-next-runtime-abi-01.c:#include "output.h" /* for asm_out_file */
objc/objc-next-runtime-abi-01.c:  ASM_DECLARE_UNRESOLVED_REFERENCE
(asm_out_file, string);
objc/objc-next-runtime-abi-01.c:  ASM_DECLARE_CLASS_REFERENCE
(asm_out_file, buf);

This seems to imply that LTO doesn't work with LTO. The functions that
use asm_out_file are handle_next_class_ref and handle_next_impent,
which both only output something for darwin, and are only called via
called from objc_generate_v1_next_metadata for ABI v1. This code is
probably not tested very well, because this is for the 32-bits
ObjC-v2.0 ABI on Darwin, whereas the default 32-bits ABI is ObjC-v1.0
The code that invokes these functions is this:

  /* Dump the class references.  This forces the appropriate classes
     to be linked into the executable image, preserving unix archive
     semantics.  This can be removed when we move to a more dynamically
     linked environment.  */

  for (chain = cls_ref_chain; chain; chain = TREE_CHAIN (chain))
    {
      handle_next_class_ref (chain);
      if (TREE_PURPOSE (chain))
        generate_classref_translation_entry (chain);
    }

  for (impent = imp_list; impent; impent = impent->next)
    handle_next_impent (impent);

What is this "more dynamically linked environment" mentioned here? Is
this an ABI that GCC needs to continue to support?

(BTW, the GCC manual says: "Starting with GCC 4.7.0, the traditional
GNU runtime API is no longer available." Shouldn't that be mentioned
as a caveat in gcc-4.7/changes.html?)


Hopefully I can eliminate the remaining #include output.h cases from
the front ends before the end of Stage 1. Once that's done, I'll
propose to add GCC_OUTPUT_H to the poisoned identifiers list under
system.h:IN_GCC_FRONTEND.

Thanks for any help you can offer,

Ciao!
Steven

Reply via email to