@@ -22,6 +22,8 @@ import llvm.CallConv;
22
22
import llvm. IntPredicate ;
23
23
import llvm. RealPredicate ;
24
24
import llvm. Opcode ;
25
+ import llvmext. ObjectFileRef ;
26
+ import llvmext. SectionIteratorRef ;
25
27
26
28
type ULongLong = u64 ;
27
29
type LongLong = i64 ;
@@ -735,6 +737,39 @@ native mod llvm = llvm_lib {
735
737
736
738
/** Adds a verification pass. */
737
739
fn LLVMAddVerifierPass ( PassManagerRef PM ) ;
740
+
741
+ // TODO: LLVMCreateMemoryBufferWithContentsOfFile is unrepresentable. Make
742
+ // a shim.
743
+ /** Destroys the memory buffer. */
744
+ fn LLVMDisposeMemoryBuffer ( MemoryBufferRef MemBuf ) ;
745
+ }
746
+
747
+ native mod llvmext = llvmext_lib {
748
+ type ObjectFileRef ;
749
+ type SectionIteratorRef ;
750
+
751
+ /** Opens an object file. */
752
+ fn LLVMCreateObjectFile ( MemoryBufferRef MemBuf ) -> ObjectFileRef ;
753
+ /** Closes an object file. */
754
+ fn LLVMDisposeObjectFile ( ObjectFileRef ObjectFile ) ;
755
+
756
+ /** Enumerates the sections in an object file. */
757
+ fn LLVMGetSections ( ObjectFileRef ObjectFile ) -> SectionIteratorRef ;
758
+ /** Destroys a section iterator. */
759
+ fn LLVMDisposeSectionIterator ( SectionIteratorRef SI ) ;
760
+ /** Returns true if the section iterator is at the end of the section
761
+ list. */
762
+ fn LLVMIsSectionIteratorAtEnd ( ObjectFileRef ObjectFile ,
763
+ SectionIteratorRef SI ) -> Bool ;
764
+ /** Moves the section iterator to point to the next section. */
765
+ fn LLVMMoveToNextSection ( SectionIteratorRef SI ) ;
766
+ /** Returns the current section name. */
767
+ fn LLVMGetSectionName ( SectionIteratorRef SI ) -> sbuf ;
768
+ /** Returns the current section size.
769
+ FIXME: The return value is actually a uint64_t! */
770
+ fn LLVMGetSectionSize ( SectionIteratorRef SI ) -> uint ;
771
+ /** Returns the current section contents as a string buffer. */
772
+ fn LLVMGetSectionContents ( SectionIteratorRef SI ) -> sbuf ;
738
773
}
739
774
740
775
/* Slightly more terse object-interface to LLVM's 'builder' functions. */
@@ -1339,6 +1374,43 @@ fn mk_pass_manager() -> pass_manager {
1339
1374
ret rec ( llpm=llpm, dtor=pass_manager_dtor ( llpm) ) ;
1340
1375
}
1341
1376
1377
+ /* Memory-managed interface to memory buffers. */
1378
+
1379
+ obj memory_buffer_dtor ( MemoryBufferRef MemBuf ) {
1380
+ drop { llvm. LLVMDisposeMemoryBuffer ( MemBuf ) ; }
1381
+ }
1382
+
1383
+ type memory_buffer = rec ( MemoryBufferRef llmb, memory_buffer_dtor dtor) ;
1384
+
1385
+ fn mk_memory_buffer ( ) -> memory_buffer {
1386
+ fail; // TODO
1387
+ }
1388
+
1389
+ /* Memory-managed interface to object files. */
1390
+
1391
+ obj object_file_dtor ( ObjectFileRef ObjectFile ) {
1392
+ drop { llvmext. LLVMDisposeObjectFile ( ObjectFile ) ; }
1393
+ }
1394
+
1395
+ type object_file = rec ( ObjectFileRef llof, object_file_dtor dtor) ;
1396
+
1397
+ fn mk_object_file ( MemoryBufferRef llmb) -> object_file {
1398
+ auto llof = llvmext. LLVMCreateObjectFile ( llmb) ;
1399
+ ret rec ( llof=llof, dtor=object_file_dtor ( llof) ) ;
1400
+ }
1401
+
1402
+ /* Memory-managed interface to section iterators. */
1403
+
1404
+ obj section_iter_dtor ( SectionIteratorRef SI ) {
1405
+ drop { llvmext. LLVMDisposeSectionIterator ( SI ) ; }
1406
+ }
1407
+
1408
+ type section_iter = rec ( SectionIteratorRef llsi, section_iter_dtor dtor) ;
1409
+
1410
+ fn mk_section_iter ( ObjectFileRef llof) -> section_iter {
1411
+ auto llsi = llvmext. LLVMGetSections ( llof) ;
1412
+ ret rec ( llsi=llsi, dtor=section_iter_dtor ( llsi) ) ;
1413
+ }
1342
1414
1343
1415
//
1344
1416
// Local Variables:
0 commit comments