aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2011-03-15 12:27:15 -0700
committerPatrick Walton <[email protected]>2011-03-15 12:27:48 -0700
commitb07634f212d7725040358815f08b575d930b4490 (patch)
treefda0315924745e8bbd4140063d56625183498714
parentImprove depfile generation for rustc. (diff)
downloadrust-b07634f212d7725040358815f08b575d930b4490.tar.xz
rust-b07634f212d7725040358815f08b575d930b4490.zip
rustc: Add Rust bindings to the LLVM object file library
-rw-r--r--src/comp/lib/llvm.rs72
-rw-r--r--src/comp/rustc.rc12
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;
+ }
}
}
}