diff options
| author | Patrick Walton <[email protected]> | 2011-03-15 12:27:15 -0700 |
|---|---|---|
| committer | Patrick Walton <[email protected]> | 2011-03-15 12:27:48 -0700 |
| commit | b07634f212d7725040358815f08b575d930b4490 (patch) | |
| tree | fda0315924745e8bbd4140063d56625183498714 | |
| parent | Improve depfile generation for rustc. (diff) | |
| download | rust-b07634f212d7725040358815f08b575d930b4490.tar.xz rust-b07634f212d7725040358815f08b575d930b4490.zip | |
rustc: Add Rust bindings to the LLVM object file library
| -rw-r--r-- | src/comp/lib/llvm.rs | 72 | ||||
| -rw-r--r-- | src/comp/rustc.rc | 12 |
2 files changed, 81 insertions, 3 deletions
diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs index f75bdbe1..8884b723 100644 --- a/src/comp/lib/llvm.rs +++ b/src/comp/lib/llvm.rs @@ -22,6 +22,8 @@ import llvm.CallConv; import llvm.IntPredicate; import llvm.RealPredicate; import llvm.Opcode; +import llvmext.ObjectFileRef; +import llvmext.SectionIteratorRef; type ULongLong = u64; type LongLong = i64; @@ -735,6 +737,39 @@ native mod llvm = llvm_lib { /** Adds a verification pass. */ fn LLVMAddVerifierPass(PassManagerRef PM); + + // TODO: LLVMCreateMemoryBufferWithContentsOfFile is unrepresentable. Make + // a shim. + /** Destroys the memory buffer. */ + fn LLVMDisposeMemoryBuffer(MemoryBufferRef MemBuf); +} + +native mod llvmext = llvmext_lib { + type ObjectFileRef; + type SectionIteratorRef; + + /** Opens an object file. */ + fn LLVMCreateObjectFile(MemoryBufferRef MemBuf) -> ObjectFileRef; + /** Closes an object file. */ + fn LLVMDisposeObjectFile(ObjectFileRef ObjectFile); + + /** Enumerates the sections in an object file. */ + fn LLVMGetSections(ObjectFileRef ObjectFile) -> SectionIteratorRef; + /** Destroys a section iterator. */ + fn LLVMDisposeSectionIterator(SectionIteratorRef SI); + /** Returns true if the section iterator is at the end of the section + list. */ + fn LLVMIsSectionIteratorAtEnd(ObjectFileRef ObjectFile, + SectionIteratorRef SI) -> Bool; + /** Moves the section iterator to point to the next section. */ + fn LLVMMoveToNextSection(SectionIteratorRef SI); + /** Returns the current section name. */ + fn LLVMGetSectionName(SectionIteratorRef SI) -> sbuf; + /** Returns the current section size. + FIXME: The return value is actually a uint64_t! */ + fn LLVMGetSectionSize(SectionIteratorRef SI) -> uint; + /** Returns the current section contents as a string buffer. */ + fn LLVMGetSectionContents(SectionIteratorRef SI) -> sbuf; } /* Slightly more terse object-interface to LLVM's 'builder' functions. */ @@ -1339,6 +1374,43 @@ fn mk_pass_manager() -> pass_manager { ret rec(llpm=llpm, dtor=pass_manager_dtor(llpm)); } +/* Memory-managed interface to memory buffers. */ + +obj memory_buffer_dtor(MemoryBufferRef MemBuf) { + drop { llvm.LLVMDisposeMemoryBuffer(MemBuf); } +} + +type memory_buffer = rec(MemoryBufferRef llmb, memory_buffer_dtor dtor); + +fn mk_memory_buffer() -> memory_buffer { + fail; // TODO +} + +/* Memory-managed interface to object files. */ + +obj object_file_dtor(ObjectFileRef ObjectFile) { + drop { llvmext.LLVMDisposeObjectFile(ObjectFile); } +} + +type object_file = rec(ObjectFileRef llof, object_file_dtor dtor); + +fn mk_object_file(MemoryBufferRef llmb) -> object_file { + auto llof = llvmext.LLVMCreateObjectFile(llmb); + ret rec(llof=llof, dtor=object_file_dtor(llof)); +} + +/* Memory-managed interface to section iterators. */ + +obj section_iter_dtor(SectionIteratorRef SI) { + drop { llvmext.LLVMDisposeSectionIterator(SI); } +} + +type section_iter = rec(SectionIteratorRef llsi, section_iter_dtor dtor); + +fn mk_section_iter(ObjectFileRef llof) -> section_iter { + auto llsi = llvmext.LLVMGetSections(llof); + ret rec(llsi=llsi, dtor=section_iter_dtor(llsi)); +} // // Local Variables: diff --git a/src/comp/rustc.rc b/src/comp/rustc.rc index c3cae312..e00f033b 100644 --- a/src/comp/rustc.rc +++ b/src/comp/rustc.rc @@ -52,17 +52,23 @@ mod lib { alt (target_os) { case ("win32") { let (llvm_lib = "LLVM-3.0.dll") { - mod llvm; + let (llvmext_lib = "rustllvm.dll") { + mod llvm; + } } } case ("macos") { let (llvm_lib = "libLLVM-3.0svn.dylib") { - mod llvm; + let (llvmext_lib = "librustllvm.dylib") { + mod llvm; + } } } else { let (llvm_lib = "libLLVM-3.0svn.so") { - mod llvm; + let (llvmext_lib = "librustllvm.so") { + mod llvm; + } } } } |