diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm-c/Core.h | 21 | ||||
-rw-r--r-- | llvm/lib/IR/Core.cpp | 9 | ||||
-rw-r--r-- | llvm/test/Bindings/llvm-c/echo.ll | 1 | ||||
-rw-r--r-- | llvm/tools/llvm-c-test/echo.cpp | 15 |
4 files changed, 37 insertions, 9 deletions
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h index f711bea2183..89e36c05688 100644 --- a/llvm/include/llvm-c/Core.h +++ b/llvm/include/llvm-c/Core.h @@ -566,6 +566,27 @@ const char *LLVMGetModuleIdentifier(LLVMModuleRef M, size_t *Len); void LLVMSetModuleIdentifier(LLVMModuleRef M, const char *Ident, size_t Len); /** + * Obtain the module's original source file name. + * + * @param M Module to obtain the name of + * @param Len Out parameter which holds the length of the returned string + * @return The original source file name of M + * @see Module::getSourceFileName() + */ +const char *LLVMGetSourceFileName(LLVMModuleRef M, size_t *Len); + +/** + * Set the original source file name of a module to a string Name with length + * Len. + * + * @param M The module to set the source file name of + * @param Name The string to set M's source file name to + * @param Len Length of Name + * @see Module::setSourceFileName() + */ +void LLVMSetSourceFileName(LLVMModuleRef M, const char *Name, size_t Len); + +/** * Obtain the data layout for a module. * * @see Module::getDataLayoutStr() diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp index d3c33edec18..052029e03a6 100644 --- a/llvm/lib/IR/Core.cpp +++ b/llvm/lib/IR/Core.cpp @@ -234,6 +234,15 @@ void LLVMSetModuleIdentifier(LLVMModuleRef M, const char *Ident, size_t Len) { unwrap(M)->setModuleIdentifier(StringRef(Ident, Len)); } +const char *LLVMGetSourceFileName(LLVMModuleRef M, size_t *Len) { + auto &Str = unwrap(M)->getSourceFileName(); + *Len = Str.length(); + return Str.c_str(); +} + +void LLVMSetSourceFileName(LLVMModuleRef M, const char *Name, size_t Len) { + unwrap(M)->setSourceFileName(StringRef(Name, Len)); +} /*--.. Data layout .........................................................--*/ const char *LLVMGetDataLayoutStr(LLVMModuleRef M) { diff --git a/llvm/test/Bindings/llvm-c/echo.ll b/llvm/test/Bindings/llvm-c/echo.ll index 689577a7002..e5db44656c4 100644 --- a/llvm/test/Bindings/llvm-c/echo.ll +++ b/llvm/test/Bindings/llvm-c/echo.ll @@ -2,6 +2,7 @@ ; RUN: llvm-as < %s | llvm-c-test --echo > %t.echo ; RUN: diff -w %t.orig %t.echo +source_filename = "/test/Bindings/echo.ll" target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.11.0" diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp index 885f9c0d899..05d80363162 100644 --- a/llvm/tools/llvm-c-test/echo.cpp +++ b/llvm/tools/llvm-c-test/echo.cpp @@ -927,18 +927,15 @@ int llvm_echo(void) { LLVMEnablePrettyStackTrace(); LLVMModuleRef Src = llvm_load_module(false, true); - size_t Len; - const char *ModuleName = LLVMGetModuleIdentifier(Src, &Len); + size_t SourceFileLen; + const char *SourceFileName = LLVMGetSourceFileName(Src, &SourceFileLen); + size_t ModuleIdentLen; + const char *ModuleName = LLVMGetModuleIdentifier(Src, &ModuleIdentLen); LLVMContextRef Ctx = LLVMContextCreate(); LLVMModuleRef M = LLVMModuleCreateWithNameInContext(ModuleName, Ctx); - // This whole switcharound is done because the C API has no way to - // set the source_filename - LLVMSetModuleIdentifier(M, "", 0); - LLVMGetModuleIdentifier(M, &Len); - if (Len != 0) - report_fatal_error("LLVM{Set,Get}ModuleIdentifier failed"); - LLVMSetModuleIdentifier(M, ModuleName, strlen(ModuleName)); + LLVMSetSourceFileName(M, SourceFileName, SourceFileLen); + LLVMSetModuleIdentifier(M, ModuleName, ModuleIdentLen); LLVMSetTarget(M, LLVMGetTarget(Src)); LLVMSetModuleDataLayout(M, LLVMGetModuleDataLayout(Src)); |