rustllvm: Add bindings to the LLVM linker

This commit is contained in:
Patrick Walton 2011-05-04 21:27:00 -07:00
parent c47a075a99
commit 729648282b
3 changed files with 22 additions and 3 deletions

View file

@ -848,7 +848,9 @@ fn LLVMRustWriteOutputFile(PassManagerRef PM, ModuleRef M,
call. */
fn LLVMRustGetLastError() -> sbuf;
/** Links LLVM modules together. `Src` is destroyed by this call and
must never be referenced again. */
fn LLVMLinkModules(ModuleRef Dest, ModuleRef Src) -> Bool;
}
native mod rustllvm = llvm_lib {

View file

@ -12,6 +12,7 @@
//
//===----------------------------------------------------------------------===//
#include "llvm/Linker.h"
#include "llvm/PassManager.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Support/FormattedStream.h"
@ -25,12 +26,13 @@
using namespace llvm;
static char *LLVMRustError;
static const char *LLVMRustError;
extern "C" LLVMMemoryBufferRef
LLVMRustCreateMemoryBufferWithContentsOfFile(const char *Path) {
LLVMMemoryBufferRef MemBuf = NULL;
LLVMCreateMemoryBufferWithContentsOfFile(Path, &MemBuf, &LLVMRustError);
LLVMCreateMemoryBufferWithContentsOfFile(Path, &MemBuf,
const_cast<char **>(&LLVMRustError));
return MemBuf;
}
@ -49,6 +51,20 @@ enum LLVMCodeGenFileType {
LLVMNullFile // Do not emit any output.
};
extern "C" bool LLVMLinkModules(LLVMModuleRef Dest, LLVMModuleRef Src) {
static std::string err;
// For some strange reason, unwrap() doesn't work here. "No matching
// function" error.
Module *DM = reinterpret_cast<Module *>(Dest);
Module *SM = reinterpret_cast<Module *>(Src);
if (Linker::LinkModules(DM, SM, &err)) {
LLVMRustError = err.c_str();
return false;
}
return true;
}
extern "C" void LLVMRustWriteOutputFile(LLVMPassManagerRef PMR,
LLVMModuleRef M,
const char *triple,

View file

@ -1,6 +1,7 @@
LLVMRustCreateMemoryBufferWithContentsOfFile
LLVMRustWriteOutputFile
LLVMRustGetLastError
LLVMLinkModules
LLVMCreateObjectFile
LLVMDisposeObjectFile
LLVMGetSections