From 5389b7784e090b1c4a0969d4922ed753d3b6444c Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Sun, 29 Jul 2018 17:58:53 +0200 Subject: [PATCH] Check signature compatibility in declare_function (fixes #427) --- cranelift/tests/moduletests.rs | 22 ++++++++++++++++++++++ lib/module/src/module.rs | 8 ++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 cranelift/tests/moduletests.rs diff --git a/cranelift/tests/moduletests.rs b/cranelift/tests/moduletests.rs new file mode 100644 index 0000000000..d829aa8e9e --- /dev/null +++ b/cranelift/tests/moduletests.rs @@ -0,0 +1,22 @@ +extern crate cranelift_codegen; +extern crate cranelift_module; +extern crate cranelift_simplejit; + +use cranelift_codegen::settings::*; +use cranelift_codegen::ir::*; +use cranelift_module::*; +use cranelift_simplejit::*; + +#[test] +fn error_on_incompatible_sig_in_declare_function() { + let mut module: Module = Module::new(SimpleJITBuilder::new()); + let mut sig = Signature { + params: vec![AbiParam::new(types::I64)], + returns: vec![], + call_conv: CallConv::SystemV, + argument_bytes: None, + }; + module.declare_function("abc", Linkage::Local, &sig).unwrap(); + sig.params[0] = AbiParam::new(types::I32); + module.declare_function("abc", Linkage::Local, &sig).err().unwrap(); // Make sure this is an error +} diff --git a/lib/module/src/module.rs b/lib/module/src/module.rs index e5b7c81883..10008caa51 100644 --- a/lib/module/src/module.rs +++ b/lib/module/src/module.rs @@ -159,8 +159,12 @@ impl ModuleFunction where B: Backend, { - fn merge(&mut self, linkage: Linkage) { + fn merge(&mut self, linkage: Linkage, sig: &ir::Signature) -> Result<(), ModuleError> { self.decl.linkage = Linkage::merge(self.decl.linkage, linkage); + if &self.decl.signature != sig { + return Err(ModuleError::IncompatibleDeclaration(self.decl.name.clone())); + } + Ok(()) } } @@ -357,7 +361,7 @@ where Occupied(entry) => match *entry.get() { FuncOrDataId::Func(id) => { let existing = &mut self.contents.functions[id]; - existing.merge(linkage); + existing.merge(linkage, signature)?; self.backend.declare_function(name, existing.decl.linkage); Ok(id) }