https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100062
Bug ID: 100062
Summary: Can't put DECL_STATIC_CONSTRUCTOR/DESTRUCTORs decls on
comdat
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: ibuclaw at gdcproject dot org
Target Milestone: ---
In the D front-end, each DSO with D code is (de)registered against the druntime
library, this is done with two functions that are approximately equivalent to:
___attribute___((visibility ("hidden"), weak, constructor)) void d.dso_ctor();
___attribute___((visibility ("hidden"), weak, destructor)) void d.dso_dtor();
This could be reduced to a single function - without the need for a static
guard to insure against multiple calls - if constructors/destructors were put
in comdat. In the examples below, I'll name it d.register_dso:
##
## ELF
##
# GCC emits this as (default_elf_init_array_asm_out_constructor):
.section .init_array,"aw"
.align 8
.quad d.register_dso
# Would like the ability to instead do:
.section .init_array,"aGw",@init_array,register_dso,comdat
.align 8
.quad d.register_dso
##
## Macho
##
# GCC emits this as(darwin_file_end/finalize_ctors)
.mod_init_func
.align 3
.quad _d.register_dso
# Would like the ability to instead do:
.section __DATA,__mod_init_func,mod_init_funcs
.globl _d.dso_ctor
.weak_definition _d.dso_ctor
.align 3
_d.dso_ctor:
.quad _d.register_dso
The above is already be achievable on darwin by ignoring
DECL_STATIC_CONSTRUCTOR, and using get_section() directly.
However on ELF, the only types that GCC emits (default_elf_asm_named_section)
are either "@nobits" or "@progbits". It is not possible to request either
"@init_array" or "@fini_array".