[Windows] Put init_seg(compiler/lib) in llvm.global_ctors
authorArthur Eubanks <aeubanks@google.com>
Mon, 15 Aug 2022 18:04:50 +0000 (11:04 -0700)
committerArthur Eubanks <aeubanks@google.com>
Tue, 16 Aug 2022 15:16:18 +0000 (08:16 -0700)
commit9181ce623fd8189252659da7c48de1982597b79c
tree3ee2a58a7942653c2109692a89cd4677f2ab120d
parentba1c396e09a6dc56d817df0d378f3c826bbacaaa
[Windows] Put init_seg(compiler/lib) in llvm.global_ctors

Currently we treat initializers with init_seg(compiler/lib) as similar
to any other init_seg, they simply have a global variable in the proper
section (".CRT$XCC" for compiler/".CRT$XCL" for lib) and are added to
llvm.used. However, this doesn't match with how LLVM sees normal (or
init_seg(user)) initializers via llvm.global_ctors. This
causes issues like incorrect init_seg(compiler) vs init_seg(user)
ordering due to GlobalOpt evaluating constructors, and the
ability to remove init_seg(compiler/lib) initializers at all.

Currently we use 'A' for priorities less than 200. Use 200 for
init_seg(compiler) (".CRT$XCC") and 400 for init_seg(lib) (".CRT$XCL"),
which do not append the priority to the section name. Priorities
between 200 and 400 use ".CRT$XCC${Priority}". This allows for
some wiggle room for people/future extensions that want to add
initializers between compiler and lib.

Fixes #56922

Reviewed By: rnk

Differential Revision: https://reviews.llvm.org/D131910
clang/include/clang/Basic/AttrDocs.td
clang/lib/CodeGen/CGDeclCXX.cpp
clang/test/CodeGenCXX/pragma-init_seg.cpp
llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
llvm/test/CodeGen/X86/ctor-priority-coff.ll