mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-16 00:56:37 +00:00

Reland #120514 after 2f6e3df08a8b7cd29273980e47310cf09c6fdbd8 fixed iteration order issue and libstdc++/libc++ differences. --- Both options instruct the linker to optimize section layout with the following goals: * `--bp-compression-sort=[data|function|both]`: Improve Lempel-Ziv compression by grouping similar sections together, resulting in a smaller compressed app size. * `--bp-startup-sort=function --irpgo-profile=<file>`: Utilize a temporal profile file to reduce page faults during program startup. The linker determines the section order by considering three groups: * Function sections ordered according to the temporal profile (`--irpgo-profile=`), prioritizing early-accessed and frequently accessed functions. * Function sections. Sections containing similar functions are placed together, maximizing compression opportunities. * Data sections. Similar data sections are placed together. Within each group, the sections are ordered using the Balanced Partitioning algorithm. The linker constructs a bipartite graph with two sets of vertices: sections and utility vertices. * For profile-guided function sections: + The number of utility vertices is determined by the symbol order within the profile file. + If `--bp-compression-sort-startup-functions` is specified, extra utility vertices are allocated to prioritize nearby function similarity. * For sections ordered for compression: Utility vertices are determined by analyzing k-mers of the section content and relocations. The call graph profile is disabled during this optimization. When `--symbol-ordering-file=` is specified, sections described in that file are placed earlier. Co-authored-by: Pengying Xu <xpy66swsry@gmail.com>
90 lines
1.5 KiB
CMake
90 lines
1.5 KiB
CMake
set(LLVM_TARGET_DEFINITIONS Options.td)
|
|
tablegen(LLVM Options.inc -gen-opt-parser-defs)
|
|
add_public_tablegen_target(ELFOptionsTableGen)
|
|
|
|
if(LLVM_ENABLE_ZLIB)
|
|
set(imported_libs ZLIB::ZLIB)
|
|
endif()
|
|
|
|
if(LLVM_ENABLE_ZSTD)
|
|
if(TARGET zstd::libzstd_shared AND NOT LLVM_USE_STATIC_ZSTD)
|
|
set(zstd_target zstd::libzstd_shared)
|
|
else()
|
|
set(zstd_target zstd::libzstd_static)
|
|
endif()
|
|
endif()
|
|
|
|
if(LLVM_ENABLE_ZSTD)
|
|
list(APPEND imported_libs ${zstd_target})
|
|
endif()
|
|
|
|
add_lld_library(lldELF
|
|
AArch64ErrataFix.cpp
|
|
Arch/AArch64.cpp
|
|
Arch/AMDGPU.cpp
|
|
Arch/ARM.cpp
|
|
Arch/AVR.cpp
|
|
Arch/Hexagon.cpp
|
|
Arch/LoongArch.cpp
|
|
Arch/Mips.cpp
|
|
Arch/MipsArchTree.cpp
|
|
Arch/MSP430.cpp
|
|
Arch/PPC.cpp
|
|
Arch/PPC64.cpp
|
|
Arch/RISCV.cpp
|
|
Arch/SPARCV9.cpp
|
|
Arch/SystemZ.cpp
|
|
Arch/X86.cpp
|
|
Arch/X86_64.cpp
|
|
ARMErrataFix.cpp
|
|
BPSectionOrderer.cpp
|
|
CallGraphSort.cpp
|
|
DWARF.cpp
|
|
Driver.cpp
|
|
DriverUtils.cpp
|
|
EhFrame.cpp
|
|
ICF.cpp
|
|
InputFiles.cpp
|
|
InputSection.cpp
|
|
LTO.cpp
|
|
LinkerScript.cpp
|
|
MapFile.cpp
|
|
MarkLive.cpp
|
|
OutputSections.cpp
|
|
Relocations.cpp
|
|
ScriptLexer.cpp
|
|
ScriptParser.cpp
|
|
SymbolTable.cpp
|
|
Symbols.cpp
|
|
SyntheticSections.cpp
|
|
Target.cpp
|
|
Thunks.cpp
|
|
Writer.cpp
|
|
|
|
LINK_COMPONENTS
|
|
${LLVM_TARGETS_TO_BUILD}
|
|
BinaryFormat
|
|
BitWriter
|
|
Core
|
|
DebugInfoDWARF
|
|
Demangle
|
|
LTO
|
|
MC
|
|
Object
|
|
Option
|
|
Passes
|
|
ProfileData
|
|
Support
|
|
TargetParser
|
|
TransformUtils
|
|
|
|
LINK_LIBS
|
|
lldCommon
|
|
${imported_libs}
|
|
${LLVM_PTHREAD_LIB}
|
|
|
|
DEPENDS
|
|
ELFOptionsTableGen
|
|
intrinsics_gen
|
|
)
|