diff --git a/hercules_cg/src/cpu.rs b/hercules_cg/src/cpu.rs index a8f16790678ea2a416622aae74818c8deab15851..eba161bbb40a038ddbc37840d4e6d7fe0ccacfb2 100644 --- a/hercules_cg/src/cpu.rs +++ b/hercules_cg/src/cpu.rs @@ -64,12 +64,21 @@ struct LLVMBlock { impl<'a> CPUContext<'a> { fn codegen_function<W: Write>(&self, w: &mut W) -> Result<(), Error> { // Dump the function signature. - write!( - w, - "define {} @{}(", - self.get_type(self.function.return_type), - self.function.name - )?; + if self.types[self.function.return_type.idx()].is_primitive() { + write!( + w, + "define dso_local {} @{}(", + self.get_type(self.function.return_type), + self.function.name + )?; + } else { + write!( + w, + "define dso_local nonnull noundef {} @{}(", + self.get_type(self.function.return_type), + self.function.name + )?; + } let mut first_param = true; // The first set of parameters are dynamic constants. for idx in 0..self.function.num_dynamic_constants { @@ -87,7 +96,16 @@ impl<'a> CPUContext<'a> { } else { write!(w, ", ")?; } - write!(w, "{} %p{}", self.get_type(*ty), idx)?; + if self.types[ty.idx()].is_primitive() { + write!(w, "{} %p{}", self.get_type(*ty), idx)?; + } else { + write!( + w, + "{} noalias nofree nonnull noundef %p{}", + self.get_type(*ty), + idx + )?; + } } write!(w, ") {{\n")?;