From 5a1cf3b2552c841a73868b1d52ce43c29198a9e8 Mon Sep 17 00:00:00 2001 From: Manman Ren Date: Mon, 10 Feb 2014 23:26:14 +0000 Subject: [PATCH] LTO API: add lto_module_create_from_memory_with_path. This function adds an extra path argument to lto_module_create_from_memory. The path argument will be passed to makeBuffer to make sure the MemoryBuffer has a name and the created module has a module identifier. This is mainly for emitting warning messages from the linker. When we emit warning message on a module, we can use the module identifier. rdar://15985737 llvm-svn: 201114 --- include/llvm-c/lto.h | 12 +++++++++++- include/llvm/LTO/LTOModule.h | 8 +++++--- lib/LTO/LTOModule.cpp | 11 ++++++----- tools/lto/lto.cpp | 11 +++++++++++ tools/lto/lto.exports | 1 + 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/include/llvm-c/lto.h b/include/llvm-c/lto.h index fbad2b56860..bff63ad0969 100644 --- a/include/llvm-c/lto.h +++ b/include/llvm-c/lto.h @@ -40,7 +40,7 @@ typedef bool lto_bool_t; * @{ */ -#define LTO_API_VERSION 8 +#define LTO_API_VERSION 9 /** * \since prior to LTO_API_VERSION=3 @@ -175,6 +175,16 @@ lto_module_create(const char* path); extern lto_module_t lto_module_create_from_memory(const void* mem, size_t length); +/** + * Loads an object file from memory with an extra path argument. + * Returns NULL on error (check lto_get_error_message() for details). + * + * \since prior to LTO_API_VERSION=9 + */ +extern lto_module_t +lto_module_create_from_memory_with_path(const void* mem, size_t length, + const char *path); + /** * Loads an object file from disk. The seek point of fd is not preserved. * Returns NULL on error (check lto_get_error_message() for details). diff --git a/include/llvm/LTO/LTOModule.h b/include/llvm/LTO/LTOModule.h index c70afa4196d..a70b71fa2ec 100644 --- a/include/llvm/LTO/LTOModule.h +++ b/include/llvm/LTO/LTOModule.h @@ -100,7 +100,8 @@ public: std::string& errMsg); static LTOModule *makeLTOModule(const void *mem, size_t length, llvm::TargetOptions options, - std::string &errMsg); + std::string &errMsg, + llvm::StringRef path = ""); /// getTargetTriple - Return the Module's target triple. const char *getTargetTriple() { @@ -222,8 +223,9 @@ private: llvm::TargetOptions options, std::string &errMsg); - /// makeBuffer - Create a MemoryBuffer from a memory range. - static llvm::MemoryBuffer *makeBuffer(const void *mem, size_t length); + /// Create a MemoryBuffer from a memory range with an optional name. + static llvm::MemoryBuffer *makeBuffer(const void *mem, size_t length, + llvm::StringRef name = ""); }; #endif // LTO_MODULE_H diff --git a/lib/LTO/LTOModule.cpp b/lib/LTO/LTOModule.cpp index 68b7313be72..909b92e8886 100644 --- a/lib/LTO/LTOModule.cpp +++ b/lib/LTO/LTOModule.cpp @@ -128,8 +128,8 @@ LTOModule *LTOModule::makeLTOModule(int fd, const char *path, LTOModule *LTOModule::makeLTOModule(const void *mem, size_t length, TargetOptions options, - std::string &errMsg) { - OwningPtr buffer(makeBuffer(mem, length)); + std::string &errMsg, StringRef path) { + OwningPtr buffer(makeBuffer(mem, length, path)); if (!buffer) return NULL; return makeLTOModule(buffer.take(), options, errMsg); @@ -186,10 +186,11 @@ LTOModule *LTOModule::makeLTOModule(MemoryBuffer *buffer, return Ret; } -/// makeBuffer - Create a MemoryBuffer from a memory range. -MemoryBuffer *LTOModule::makeBuffer(const void *mem, size_t length) { +/// Create a MemoryBuffer from a memory range with an optional name. +MemoryBuffer *LTOModule::makeBuffer(const void *mem, size_t length, + StringRef name) { const char *startPtr = (const char*)mem; - return MemoryBuffer::getMemBuffer(StringRef(startPtr, length), "", false); + return MemoryBuffer::getMemBuffer(StringRef(startPtr, length), name, false); } /// objcClassNameFromExpression - Get string that the data pointer points to. diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp index 967250acd71..d2f1ffdfa23 100644 --- a/tools/lto/lto.cpp +++ b/tools/lto/lto.cpp @@ -156,6 +156,17 @@ lto_module_t lto_module_create_from_memory(const void* mem, size_t length) { return LTOModule::makeLTOModule(mem, length, Options, sLastErrorString); } +/// Loads an object file from memory with an extra path argument. +/// Returns NULL on error (check lto_get_error_message() for details). +lto_module_t lto_module_create_from_memory_with_path(const void* mem, + size_t length, + const char *path) { + lto_initialize(); + llvm::TargetOptions Options; + lto_set_target_options(Options); + return LTOModule::makeLTOModule(mem, length, Options, sLastErrorString, path); +} + /// lto_module_dispose - Frees all memory for a module. Upon return the /// lto_module_t is no longer valid. void lto_module_dispose(lto_module_t mod) { diff --git a/tools/lto/lto.exports b/tools/lto/lto.exports index 9b8dcb5f09e..b10ab1a3e6c 100644 --- a/tools/lto/lto.exports +++ b/tools/lto/lto.exports @@ -5,6 +5,7 @@ lto_module_create lto_module_create_from_fd lto_module_create_from_fd_at_offset lto_module_create_from_memory +lto_module_create_from_memory_with_path lto_module_get_deplib lto_module_get_linkeropt lto_module_get_num_deplibs