mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-28 07:05:03 +00:00
3fd7e37b34
There is a fundamental difference between how the gold API and lib/LTO view the LTO process. The gold API talks about a particular symbol in a particular file. The lib/LTO API talks about a symbol in the merged module. The merged module is then defined in terms of the IR semantics. In particular, a linkonce_odr GV is only copied if it is used, since it is valid to drop unused linkonce_odr GVs. In the testcase in pr19901 both properties collide. What happens is that gold asks us to keep a particular linkonce_odr symbol, but the IR linker doesn't copy it to the merged module and we never have a chance to ask lib/LTO to keep it. This patch fixes it by having a more direct implementation of the gold API. If it asks us to keep a symbol, we change the linkage so it is not linkonce. If it says we can drop a symbol, we do so. All of this before we even send the module to lib/Linker. Since now we don't have to produce LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN, during symbol resolution we can use a temporary LLVMContext and do lazy module loading. This allows us to keep the minimum possible amount of allocated memory around. This should also allow as much parallelism as we want, since there is no shared context. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216215 91177308-0d34-0410-b5e6-96231b3b80d8
30 lines
776 B
CMake
30 lines
776 B
CMake
set(LLVM_BINUTILS_INCDIR "" CACHE PATH
|
|
"PATH to binutils/include containing plugin-api.h for gold plugin.")
|
|
|
|
set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/gold.exports)
|
|
|
|
if( NOT LLVM_BINUTILS_INCDIR )
|
|
# Nothing to say.
|
|
elseif( NOT EXISTS "${LLVM_BINUTILS_INCDIR}/plugin-api.h" )
|
|
message(STATUS "plugin-api.h not found. gold plugin excluded from the build.")
|
|
else()
|
|
include_directories( ${LLVM_BINUTILS_INCDIR} )
|
|
|
|
# Because off_t is used in the public API, the largefile parts are required for
|
|
# ABI compatibility.
|
|
add_definitions( -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 )
|
|
|
|
set(LLVM_LINK_COMPONENTS
|
|
${LLVM_TARGETS_TO_BUILD}
|
|
Linker
|
|
BitWriter
|
|
IPO
|
|
)
|
|
|
|
add_llvm_loadable_module(LLVMgold
|
|
gold-plugin.cpp
|
|
)
|
|
|
|
endif()
|
|
|