Skip to content

Commit c604d2e

Browse files
Add a way to generate a list of symbols for dynamic linkage, resolves mozilla#907
1 parent 3ed9434 commit c604d2e

File tree

127 files changed

+569
-36
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

127 files changed

+569
-36
lines changed

src/bindgen/bindings.rs

+22-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::cell::RefCell;
77
use std::collections::HashMap;
88
use std::fs;
99
use std::fs::File;
10-
use std::io::{Read, Write};
10+
use std::io::{BufWriter, Read, Write};
1111
use std::path;
1212
use std::rc::Rc;
1313

@@ -129,6 +129,27 @@ impl Bindings {
129129
fields
130130
}
131131

132+
/// Lists the exported symbols that can be dynamically linked, i.e. globals and functions.
133+
pub fn dynamic_symbols_names(&self) -> impl Iterator<Item = &str> {
134+
use crate::bindgen::ir::Item;
135+
136+
let function_names = self.functions.iter().map(|f| f.path().name());
137+
let global_names = self.globals.iter().map(|g| g.export_name());
138+
function_names.chain(global_names)
139+
}
140+
141+
pub fn generate_symfile<P: AsRef<path::Path>>(&self, symfile_path: P) {
142+
if let Some(dir) = symfile_path.as_ref().parent() {
143+
std::fs::create_dir_all(dir).unwrap();
144+
}
145+
let mut writer = BufWriter::new(File::create(symfile_path).unwrap());
146+
write!(&mut writer, "{{\n").expect("writing symbol file header failed");
147+
for symbol in self.dynamic_symbols_names() {
148+
write!(&mut writer, "{};\n", symbol).expect("writing symbol failed");
149+
}
150+
write!(&mut writer, "}};").expect("writing symbol file footer failed");
151+
}
152+
132153
pub fn generate_depfile<P: AsRef<path::Path>>(&self, header_path: P, depfile_path: P) {
133154
if let Some(dir) = depfile_path.as_ref().parent() {
134155
if !dir.exists() {

src/main.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,17 @@ fn main() {
298298
This option is ignored if `--out` is missing."
299299
)
300300
)
301+
.arg(
302+
Arg::new("symfile")
303+
.value_name("PATH")
304+
.long("symfile")
305+
.num_args(1)
306+
.required(false)
307+
.help("Generate a list of symbols at the given Path. This list can be \
308+
given to a linker in order to compile an application that exposes \
309+
dynamic symbols. Useful when creating a plugin system with a C interface."
310+
)
311+
)
301312
.get_matches();
302313

303314
if matches.get_flag("verify") && !matches.contains_id("out") {
@@ -343,7 +354,10 @@ fn main() {
343354
std::process::exit(2);
344355
}
345356
if let Some(depfile) = matches.get_one("depfile") {
346-
bindings.generate_depfile(file, depfile)
357+
bindings.generate_depfile(file, depfile);
358+
}
359+
if let Some(symfile) = matches.get_one::<String>("symfile") {
360+
bindings.generate_symfile(symfile);
347361
}
348362
}
349363
_ => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
c;
3+
c_unwind;
4+
};
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
foo;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};

tests/expectations-symbols/body.c.sym

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};

tests/expectations-symbols/box.c.sym

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
root;
3+
drop_box;
4+
drop_box_opt;
5+
};
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
O;
3+
root;
4+
};

tests/expectations-symbols/cell.c.sym

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};

tests/expectations-symbols/cfg.c.sym

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
root;
3+
root;
4+
cond;
5+
};
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};

tests/expectations-symbols/char.c.sym

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
push;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
new_set;
3+
set_for_each;
4+
new_map;
5+
map_for_each;
6+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
init_parens_parser;
3+
destroy_parens_parser;
4+
init_braces_parser;
5+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
until_nul;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
one;
3+
two;
4+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
C;
3+
D;
4+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
D;
3+
C;
4+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
get_x;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
deprecated_without_note;
3+
deprecated_without_bracket;
4+
deprecated_with_note;
5+
deprecated_with_note_and_since;
6+
deprecated_with_note_which_requires_to_be_escaped;
7+
dummy;
8+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
push_item;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
root;
3+
trunk;
4+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};

tests/expectations-symbols/enum.c.sym

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
extra_debug_fn;
3+
root;
4+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
get_x;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
get_x;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
extra_debug_fn;
3+
cbindgen;
4+
root;
5+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
do_the_thing_with_export_name;
3+
};
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
foo;
3+
bar;
4+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
first;
3+
second;
4+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
consume_ext;
3+
};

tests/expectations-symbols/fns.c.sym

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
root;
3+
no_return;
4+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
unnamed;
3+
pointer_test;
4+
print_from_rust;
5+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
loop_forever;
3+
normal_return;
4+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
my_function;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
A;
3+
B;
4+
C;
5+
D;
6+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
C;
3+
B;
4+
D;
5+
A;
6+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
MUT_GLOBAL_ARRAY;
3+
CONST_GLOBAL_ARRAY;
4+
};
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
no_ignore_root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
root;
3+
};

0 commit comments

Comments
 (0)