[llvm-c] Expose LLVM{Get,Set}ModuleIdentifier

Patch by Nicole Mazzuca <npmazzuca@gmail.com>.

Differential Revision: http://reviews.llvm.org/D18736

llvm-svn: 265394
This commit is contained in:
Peter Zotov 2016-04-05 13:56:59 +00:00
parent edd0920371
commit 160b188fc9
3 changed files with 42 additions and 2 deletions

View File

@ -480,6 +480,26 @@ LLVMModuleRef LLVMCloneModule(LLVMModuleRef M);
*/
void LLVMDisposeModule(LLVMModuleRef M);
/**
* Obtain the identifier of a module.
*
* @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()
*/
const char *LLVMGetModuleIdentifier(LLVMModuleRef M, size_t *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, size_t Len);
/**
* Obtain the data layout for a module.
*

View File

@ -157,6 +157,17 @@ void LLVMDisposeModule(LLVMModuleRef M) {
delete unwrap(M);
}
const char *LLVMGetModuleIdentifier(LLVMModuleRef M, size_t *Len) {
auto &Str = unwrap(M)->getModuleIdentifier();
*Len = Str.length();
return Str.c_str();
}
void LLVMSetModuleIdentifier(LLVMModuleRef M, const char *Ident, size_t Len) {
unwrap(M)->setModuleIdentifier(StringRef(Ident, Len));
}
/*--.. Data layout .........................................................--*/
const char *LLVMGetDataLayoutStr(LLVMModuleRef M) {
return unwrap(M)->getDataLayoutStr().c_str();

View File

@ -865,9 +865,18 @@ int llvm_echo(void) {
LLVMEnablePrettyStackTrace();
LLVMModuleRef Src = llvm_load_module(false, true);
size_t Len;
const char *ModuleName = LLVMGetModuleIdentifier(Src, &Len);
LLVMContextRef Ctx = LLVMContextCreate();
LLVMModuleRef M = LLVMModuleCreateWithNameInContext("<stdin>", Ctx);
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));
LLVMSetTarget(M, LLVMGetTarget(Src));
LLVMSetModuleDataLayout(M, LLVMGetModuleDataLayout(Src));