Skip to content

Commit

Permalink
[LTO][Legacy] Add new C inferface to query libcall functions
Browse files Browse the repository at this point in the history
Summary:
This is needed to implemented the same approach as lld (implemented in r338434)
for how to handling symbols that can be generated by LTO code generator
but not present in the symbol table for linker that uses legacy C APIs.

libLTO is in charge of providing the list of symbols. Linker is in
charge of implementing the eager loading from static libraries using
the list of symbols.

rdar://problem/52853974

Reviewers: tejohnson, bd1976llvm, deadalnix, espindola

Reviewed By: tejohnson

Subscribers: emaste, arichardson, hiraditya, MaskRay, dang, kledzik, mehdi_amini, inglorion, jkorous, dexonsmith, ributzka, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D67568

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@372021 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
cachemeifyoucan committed Sep 16, 2019
1 parent 713b7a4 commit 1cb2400
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 1 deletion.
10 changes: 9 additions & 1 deletion include/llvm-c/lto.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ typedef bool lto_bool_t;
* @{
*/

#define LTO_API_VERSION 24
#define LTO_API_VERSION 25

/**
* \since prior to LTO_API_VERSION=3
Expand Down Expand Up @@ -592,6 +592,14 @@ extern const char * lto_input_get_dependent_library(lto_input_t input,
size_t index,
size_t *size);

/**
* Returns the list of libcall symbols that can be generated by LTO
* that might not be visible from the symbol table of bitcode files.
*
* \since prior to LTO_API_VERSION=25
*/
extern const char *const *lto_runtime_lib_symbols_list(size_t *size);

/**
* @} // endgoup LLVMCLTO
* @defgroup LLVMCTLTO ThinLTO
Expand Down
4 changes: 4 additions & 0 deletions include/llvm/LTO/LTO.h
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,10 @@ class LTO {
/// Cache) for each task identifier.
Error run(AddStreamFn AddStream, NativeObjectCache Cache = nullptr);

/// Static method that returns a list of libcall symbols that can be generated
/// by LTO but might not be visible from bitcode symbol table.
static ArrayRef<const char*> getRuntimeLibcallSymbols();

private:
Config Conf;

Expand Down
10 changes: 10 additions & 0 deletions lib/LTO/LTO.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1011,6 +1011,16 @@ Error LTO::runRegularLTO(AddStreamFn AddStream) {
std::move(RegularLTO.CombinedModule), ThinLTO.CombinedIndex);
}

static const char *libcallRoutineNames[] = {
#define HANDLE_LIBCALL(code, name) name,
#include "llvm/IR/RuntimeLibcalls.def"
#undef HANDLE_LIBCALL
};

ArrayRef<const char*> LTO::getRuntimeLibcallSymbols() {
return makeArrayRef(libcallRoutineNames);
}

/// This class defines the interface to the ThinLTO backend.
class lto::ThinBackendProc {
protected:
Expand Down
6 changes: 6 additions & 0 deletions tools/lto/lto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -652,3 +652,9 @@ extern const char *lto_input_get_dependent_library(lto_input_t input,
size_t *size) {
return LTOModule::getDependentLibrary(unwrap(input), index, size);
}

extern const char *const *lto_runtime_lib_symbols_list(size_t *size) {
auto symbols = lto::LTO::getRuntimeLibcallSymbols();
*size = symbols.size();
return symbols.data();
}
1 change: 1 addition & 0 deletions tools/lto/lto.exports
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,4 @@ lto_input_create
lto_input_dispose
lto_input_get_num_dependent_libraries
lto_input_get_dependent_library
lto_runtime_lib_symbols_list

0 comments on commit 1cb2400

Please sign in to comment.