Mark emit_to_memory as unsafe, and introduce a safe emit. (#281)

* Mark emit_to_memory as unsafe, and provide a safe compile_and_emit.

Mark `Context::emit_to_memory` and `MemoryCodeSink::new` as unsafe, as
`MemoryCodeSink` does not perform bounds checking when writing to
memory.

Add a `Context::compile_and_emit` function which provides a convenient
interface for doing `compile` and `emit_to_memory` in one step, and
which can also provide a safe interface, since it allocates memory of
the needed size itself.

* Mention that `MemoryCodeSink` can't guarantee that the pointer is valid.
This commit is contained in:
Dan Gohman
2018-04-18 06:35:47 -07:00
committed by GitHub
parent 80da1a1e9f
commit d7e13284b2
5 changed files with 56 additions and 19 deletions

View File

@@ -107,12 +107,14 @@ impl Backend for FaerieBackend {
// that traps.
let mut trap_sink = NullTrapSink {};
ctx.emit_to_memory(
code.as_mut_ptr(),
&mut reloc_sink,
&mut trap_sink,
&*self.isa,
);
unsafe {
ctx.emit_to_memory(
&*self.isa,
code.as_mut_ptr(),
&mut reloc_sink,
&mut trap_sink,
)
};
}
self.artifact.define(name, code).expect(