Index: include/llvm-c/Core.h =================================================================== --- include/llvm-c/Core.h +++ include/llvm-c/Core.h @@ -565,6 +565,27 @@ */ 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. * Index: lib/IR/Core.cpp =================================================================== --- lib/IR/Core.cpp +++ lib/IR/Core.cpp @@ -234,6 +234,15 @@ 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) { Index: tools/llvm-c-test/echo.cpp =================================================================== --- tools/llvm-c-test/echo.cpp +++ tools/llvm-c-test/echo.cpp @@ -927,18 +927,15 @@ 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));