]> granicus.if.org Git - llvm/commitdiff
[LTO][Legacy] Add new C inferface to query libcall functions
authorSteven Wu <stevenwu@apple.com>
Mon, 16 Sep 2019 18:49:54 +0000 (18:49 +0000)
committerSteven Wu <stevenwu@apple.com>
Mon, 16 Sep 2019 18:49:54 +0000 (18:49 +0000)
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

include/llvm-c/lto.h
include/llvm/LTO/LTO.h
lib/LTO/LTO.cpp
tools/lto/lto.cpp
tools/lto/lto.exports

index 0ec490fcd5a9187d3dcbfe52bc0fb1818b747c3d..41e6067cf44f5f7c343bb52f6497081872beba63 100644 (file)
@@ -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
@@ -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
index 4bf93c5ee44506bf4c960d35c128789d5b0d2488..407af5e8de5d5ce6bd7a50f85a41d8a221320041 100644 (file)
@@ -298,6 +298,10 @@ public:
   /// 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;
 
index 4696265a23204951210f29c28f813288c7b093c8..9e16cba44fde3bbfe097cbbadca914aa6739653f 100644 (file)
@@ -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:
index ce670c22c7fb8f229fabd4f3215d723885e0d8d7..9ff16e85db4c763ff06aaec2a4e273ac69e31869 100644 (file)
@@ -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();
+}
index 6913e0e70dc303857ab3ee90e4660725d09304e1..d24809fe762f51a6b57ed25311f69ed7c5ca3061 100644 (file)
@@ -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