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