From 03456a176dd8c83b050eb24986786a0dbae53bc9 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 --- llvm/include/llvm-c/lto.h | 12 +++++++++++- llvm/include/llvm/LTO/LTOModule.h | 8 +++++--- llvm/lib/LTO/LTOModule.cpp | 11 ++++++----- llvm/tools/lto/lto.cpp | 11 +++++++++++ llvm/tools/lto/lto.exports | 1 + 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/llvm/include/llvm-c/lto.h b/llvm/include/llvm-c/lto.h index fbad2b5..bff63ad 100644 --- a/llvm/include/llvm-c/lto.h +++ b/llvm/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 @@ -176,6 +176,16 @@ 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/llvm/include/llvm/LTO/LTOModule.h b/llvm/include/llvm/LTO/LTOModule.h index c70afa4..a70b71f 100644 --- a/llvm/include/llvm/LTO/LTOModule.h +++ b/llvm/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/llvm/lib/LTO/LTOModule.cpp b/llvm/lib/LTO/LTOModule.cpp index 68b7313..909b92e 100644 --- a/llvm/lib/LTO/LTOModule.cpp +++ b/llvm/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/llvm/tools/lto/lto.cpp b/llvm/tools/lto/lto.cpp index 967250a..d2f1ffd 100644 --- a/llvm/tools/lto/lto.cpp +++ b/llvm/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/llvm/tools/lto/lto.exports b/llvm/tools/lto/lto.exports index 9b8dcb5..b10ab1a 100644 --- a/llvm/tools/lto/lto.exports +++ b/llvm/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 -- 2.7.4