Index: include/llvm-c/Core.h =================================================================== --- include/llvm-c/Core.h +++ include/llvm-c/Core.h @@ -481,6 +481,27 @@ void LLVMDisposeModule(LLVMModuleRef M); /** + * Obtain the identifier of a module. The result must be discarded with + * LLVMDisposeMessage. + * + * @param M Module to obtain identifier of + * @param Len Out parameter which holds the length of the returned string. + * @return The identifier of M. + * @see Module::getModuleIdentifier() + */ +char *LLVMGetModuleIdentifier(LLVMModuleRef M, unsigned *Len); + +/** + * Set the identifier of a module to a string Ident with length Len. + * + * @param M The module to set identifier + * @param Ident The string to set M's identifier to + * @param Len Length of Ident + * @see Module::setModuleIdentifier() + */ +void LLVMSetModuleIdentifier(LLVMModuleRef M, const char *Ident, unsigned Len); + +/** * Obtain the data layout for a module. * * @see Module::getDataLayoutStr() Index: lib/IR/Core.cpp =================================================================== --- lib/IR/Core.cpp +++ lib/IR/Core.cpp @@ -157,6 +157,20 @@ delete unwrap(M); } +char *LLVMGetModuleIdentifier(LLVMModuleRef M, unsigned *Len) { + auto Ret = strdup(unwrap(M)->getModuleIdentifier().c_str()); + auto ModuleLen = strlen(Ret); + assert(ModuleLen < UINT_MAX && "Module identifier is too long"); + *Len = (unsigned)ModuleLen; + return Ret; +} + +void LLVMSetModuleIdentifier(LLVMModuleRef M, const char *Ident, + unsigned Len) { + unwrap(M)->setModuleIdentifier({Ident, Len}); +} + + /*--.. Data layout .........................................................--*/ const char *LLVMGetDataLayoutStr(LLVMModuleRef M) { return unwrap(M)->getDataLayoutStr().c_str(); Index: tools/llvm-c-test/echo.cpp =================================================================== --- tools/llvm-c-test/echo.cpp +++ tools/llvm-c-test/echo.cpp @@ -862,12 +862,23 @@ } int llvm_echo(void) { + const char *ModuleName = ""; + LLVMEnablePrettyStackTrace(); LLVMModuleRef Src = llvm_load_module(false, true); LLVMContextRef Ctx = LLVMContextCreate(); - LLVMModuleRef M = LLVMModuleCreateWithNameInContext("", Ctx); + LLVMModuleRef M = LLVMModuleCreateWithNameInContext(ModuleName, Ctx); + + // This whole switcharound is done because the C API has no way to + // set the source_filename + unsigned Len; + LLVMSetModuleIdentifier(M, "", 0); + LLVMGetModuleIdentifier(M, &Len); + if (Len != 0) + report_fatal_error("LLVM{Set,Get}ModuleIdentifier failed"); + LLVMSetModuleIdentifier(M, ModuleName, strlen(ModuleName)); LLVMSetTarget(M, LLVMGetTarget(Src)); LLVMSetModuleDataLayout(M, LLVMGetModuleDataLayout(Src));