Skip to content
This repository was archived by the owner on Mar 24, 2022. It is now read-only.

Commit 4bfef0a

Browse files
Pat Hickeyfroydnj
authored andcommitted
move faerie-related code from traps to output
1 parent 312eda4 commit 4bfef0a

2 files changed

Lines changed: 42 additions & 48 deletions

File tree

lucetc/src/output.rs

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ use crate::error::Error;
22
use crate::name::Name;
33
use crate::stack_probe;
44
use crate::table::{link_tables, TABLE_SYM};
5-
use crate::traps::{trap_sym_for_func, write_trap_tables};
5+
use crate::traps::{translate_trapcode, trap_sym_for_func};
66
use byteorder::{LittleEndian, WriteBytesExt};
77
use cranelift_codegen::{ir, isa, binemit::TrapSink};
88
use cranelift_faerie::traps::{FaerieTrapManifest, FaerieTrapSink};
99
use cranelift_faerie::FaerieProduct;
1010
use faerie::{Artifact, Decl, Link};
1111
use lucet_module::{
12-
FunctionSpec, SerializedModule, VersionInfo, LUCET_MODULE_SYM, MODULE_DATA_SYM,
12+
FunctionSpec, SerializedModule, TrapSite, VersionInfo, LUCET_MODULE_SYM, MODULE_DATA_SYM,
1313
};
1414
use std::collections::HashMap;
1515
use std::fs::File;
@@ -88,7 +88,7 @@ impl ObjectFile {
8888
}
8989
}
9090

91-
write_trap_tables(&trap_manifest, &mut obj.artifact)?;
91+
obj.write_trap_tables(&trap_manifest)?;
9292
obj.write_function_manifest(function_manifest.as_slice())?;
9393
link_tables(table_manifest.as_slice(), &mut obj.artifact)?;
9494

@@ -213,6 +213,44 @@ impl ObjectFile {
213213
Ok(())
214214
}
215215

216+
fn write_trap_tables(&mut self, manifest: &FaerieTrapManifest) -> Result<(), Error> {
217+
for sink in manifest.sinks.iter() {
218+
let func_sym = &sink.name;
219+
let trap_sym = trap_sym_for_func(func_sym);
220+
221+
self.artifact.declare(&trap_sym, Decl::data()).map_err(|source| {
222+
let message = format!("Trap table error declaring {}", trap_sym);
223+
Error::ArtifactError(source, message)
224+
})?;
225+
226+
// write the actual function-level trap table
227+
let traps: Vec<TrapSite> = sink
228+
.sites
229+
.iter()
230+
.map(|site| TrapSite {
231+
offset: site.offset,
232+
code: translate_trapcode(site.code),
233+
})
234+
.collect();
235+
236+
let trap_site_bytes = unsafe {
237+
std::slice::from_raw_parts(
238+
traps.as_ptr() as *const u8,
239+
traps.len() * std::mem::size_of::<TrapSite>(),
240+
)
241+
};
242+
243+
// and write the function trap table into the object
244+
self.artifact.define(&trap_sym, trap_site_bytes.to_vec())
245+
.map_err(|source| {
246+
let message = format!("Trap table error defining {}", trap_sym);
247+
Error::ArtifactError(source, message)
248+
})?;
249+
}
250+
251+
Ok(())
252+
}
253+
216254
pub fn write<P: AsRef<Path>>(&self, path: P) -> Result<(), Error> {
217255
let _ = path.as_ref().file_name().ok_or(|| {
218256
let message = format!("Path must be filename {:?}", path.as_ref());

lucetc/src/traps.rs

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,4 @@
1-
use crate::error::Error;
2-
31
use cranelift_codegen::ir;
4-
use cranelift_faerie::traps::FaerieTrapManifest;
5-
6-
use faerie::{Artifact, Decl};
7-
use lucet_module::TrapSite;
8-
9-
pub fn write_trap_tables(manifest: &FaerieTrapManifest, obj: &mut Artifact) -> Result<(), Error> {
10-
for sink in manifest.sinks.iter() {
11-
let func_sym = &sink.name;
12-
let trap_sym = trap_sym_for_func(func_sym);
13-
14-
obj.declare(&trap_sym, Decl::data()).map_err(|source| {
15-
let message = format!("Trap table error declaring {}", trap_sym);
16-
Error::ArtifactError(source, message)
17-
})?;
18-
19-
// write the actual function-level trap table
20-
let traps: Vec<TrapSite> = sink
21-
.sites
22-
.iter()
23-
.map(|site| TrapSite {
24-
offset: site.offset,
25-
code: translate_trapcode(site.code),
26-
})
27-
.collect();
28-
29-
let trap_site_bytes = unsafe {
30-
std::slice::from_raw_parts(
31-
traps.as_ptr() as *const u8,
32-
traps.len() * std::mem::size_of::<TrapSite>(),
33-
)
34-
};
35-
36-
// and write the function trap table into the object
37-
obj.define(&trap_sym, trap_site_bytes.to_vec())
38-
.map_err(|source| {
39-
let message = format!("Trap table error defining {}", trap_sym);
40-
Error::ArtifactError(source, message)
41-
})?;
42-
}
43-
44-
Ok(())
45-
}
462

473
pub(crate) fn trap_sym_for_func(sym: &str) -> String {
484
return format!("lucet_trap_table_{}", sym);
@@ -55,7 +11,7 @@ pub(crate) fn trap_sym_for_func(sym: &str) -> String {
5511
//
5612
// Not all types have subtypes. Currently, only the user User type has a
5713
// subtype.
58-
fn translate_trapcode(code: ir::TrapCode) -> lucet_module::TrapCode {
14+
pub(crate) fn translate_trapcode(code: ir::TrapCode) -> lucet_module::TrapCode {
5915
match code {
6016
ir::TrapCode::StackOverflow => lucet_module::TrapCode::StackOverflow,
6117
ir::TrapCode::HeapOutOfBounds => lucet_module::TrapCode::HeapOutOfBounds,

0 commit comments

Comments
 (0)