add function parameters
authorJacob Lifshay <programmerjake@gmail.com>
Wed, 17 Oct 2018 08:23:42 +0000 (01:23 -0700)
committerJacob Lifshay <programmerjake@gmail.com>
Wed, 17 Oct 2018 08:23:42 +0000 (01:23 -0700)
shader-compiler-llvm-7/src/backend.rs
shader-compiler/src/backend/mod.rs

index 3e02ad799075806b1edbdc0144af6c6a062a85a5..26964bf91a0bed795ee313654d6ea34939b789e0 100644 (file)
@@ -223,6 +223,7 @@ impl<'a> backend::BuildableBasicBlock<'a> for LLVM7BasicBlock {
 pub struct LLVM7Function {
     context: llvm::LLVMContextRef,
     function: llvm::LLVMValueRef,
+    parameters: Box<[LLVM7Value]>,
 }
 
 impl fmt::Debug for LLVM7Function {
@@ -250,6 +251,9 @@ impl<'a> backend::Function<'a> for LLVM7Function {
             ))
         }
     }
+    fn parameters(&self) -> &[LLVM7Value] {
+        &self.parameters
+    }
 }
 
 pub struct LLVM7Context {
@@ -424,9 +428,15 @@ impl<'a> backend::Module<'a> for LLVM7Module {
         assert!(self.name_set.insert(name.into()));
         let name = CString::new(name).unwrap();
         unsafe {
+            let function = llvm::LLVMAddFunction(self.module, name.as_ptr(), ty.0);
+            let mut parameters = Vec::new();
+            parameters.resize(llvm::LLVMCountParams(function) as usize, null_mut());
+            llvm::LLVMGetParams(function, parameters.as_mut_ptr());
+            let parameters: Vec<_> = parameters.into_iter().map(LLVM7Value).collect();
             LLVM7Function {
                 context: self.context,
                 function: llvm::LLVMAddFunction(self.module, name.as_ptr(), ty.0),
+                parameters: parameters.into_boxed_slice(),
             }
         }
     }
index f3418b8523aad92c21569405851b1c21481f5e1f..97f7441705bbbf84e639e50b681e2e4f8dcc428d 100644 (file)
@@ -75,6 +75,8 @@ pub trait Function<'a>: Debug + Sized {
         &mut self,
         name: Option<&str>,
     ) -> <Self::Context as Context<'a>>::BuildableBasicBlock;
+    /// get this function's parameters
+    fn parameters(&self) -> &[<Self::Context as Context<'a>>::Value];
 }
 
 /// module verification failure; returned from `Module::verify`