[all-commits] [llvm/llvm-project] 9181ce: [Windows] Put init_seg(compiler/lib) in llvm.globa...

aeubanks via All-commits all-commits at lists.llvm.org
Tue Aug 16 08:25:51 PDT 2022

  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 9181ce623fd8189252659da7c48de1982597b79c
  Author: Arthur Eubanks <aeubanks at google.com>
  Date:   2022-08-16 (Tue, 16 Aug 2022)

  Changed paths:
    M clang/include/clang/Basic/AttrDocs.td
    M clang/lib/CodeGen/CGDeclCXX.cpp
    M clang/test/CodeGenCXX/pragma-init_seg.cpp
    M llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
    M llvm/test/CodeGen/X86/ctor-priority-coff.ll

  Log Message:
  [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

More information about the All-commits mailing list