Pārlūkot izejas kodu

xtask: aya-bpf-bindings: generate bindings for aarch64

Alessandro Decina 4 gadi atpakaļ
vecāks
revīzija
9d112c35c7
1 mainītis faili ar 54 papildinājumiem un 50 dzēšanām
  1. 54 50
      xtask/src/codegen/aya_bpf_bindings.rs

+ 54 - 50
xtask/src/codegen/aya_bpf_bindings.rs

@@ -7,7 +7,7 @@ use structopt::StructOpt;
 use aya_gen::{
     bindgen,
     getters::{generate_getters_for_items, read_getter},
-    write_to_file, write_to_file_fmt,
+    write_to_file_fmt,
 };
 use syn::{parse_str, Item};
 
@@ -18,68 +18,72 @@ use crate::codegen::{
 
 #[derive(StructOpt)]
 pub struct CodegenOptions {
-    #[structopt(long)]
-    arch: Architecture,
-
     #[structopt(long)]
     libbpf_dir: PathBuf,
 }
 
 pub fn codegen(opts: CodegenOptions) -> Result<(), anyhow::Error> {
     let dir = PathBuf::from("bpf/aya-bpf-bindings");
-    let generated = dir.join("src").join(opts.arch.to_string());
 
-    let mut bindgen = bindgen::bpf_builder()
-        .header(&*dir.join("include/bindings.h").to_string_lossy())
-        .clang_args(&["-I", &*opts.libbpf_dir.join("src").to_string_lossy()]);
+    let builder = || {
+        let mut bindgen = bindgen::bpf_builder()
+            .header(&*dir.join("include/bindings.h").to_string_lossy())
+            .clang_args(&["-I", &*opts.libbpf_dir.join("src").to_string_lossy()]);
 
-    let types = ["bpf_map_.*"];
-    let vars = ["BPF_.*", "bpf_.*"];
+        let types = ["bpf_map_.*"];
+        let vars = ["BPF_.*", "bpf_.*"];
 
-    for x in &types {
-        bindgen = bindgen.whitelist_type(x);
-    }
+        for x in &types {
+            bindgen = bindgen.whitelist_type(x);
+        }
 
-    for x in &vars {
-        bindgen = bindgen.whitelist_var(x);
-    }
+        for x in &vars {
+            bindgen = bindgen.whitelist_var(x);
+        }
 
-    let bindings = bindgen
-        .generate()
-        .map_err(|_| anyhow!("bindgen failed"))?
-        .to_string();
+        bindgen
+    };
 
-    let mut tree = parse_str::<syn::File>(&bindings).unwrap();
-    let (indexes, helpers) = extract_helpers(&tree.items);
-    let helpers = expand_helpers(&helpers);
-    for index in indexes {
-        tree.items[index] = Item::Verbatim(TokenStream::new())
-    }
+    for arch in Architecture::supported() {
+        let generated = dir.join("src").join(arch.to_string());
 
-    // write the bindings, with the original helpers removed
-    write_to_file(
-        &generated.join("bindings.rs"),
-        &tree.to_token_stream().to_string(),
-    )?;
-
-    // write the new helpers as expanded by expand_helpers()
-    write_to_file_fmt(
-        &generated.join("helpers.rs"),
-        &format!("use super::bindings::*; {}", helpers.to_string()),
-    )?;
-
-    // write the bpf_probe_read() getters
-    let bpf_probe_read = syn::parse_str("crate::bpf_probe_read").unwrap();
-    write_to_file_fmt(
-        &generated.join("getters.rs"),
-        &format!(
-            "use super::bindings::*; {}",
-            &generate_getters_for_items(&tree.items, |getter| {
-                read_getter(getter, &bpf_probe_read)
-            })
-            .to_string()
-        ),
-    )?;
+        let bindings = builder()
+            .generate()
+            .map_err(|_| anyhow!("bindgen failed"))?
+            .to_string();
+
+        let mut tree = parse_str::<syn::File>(&bindings).unwrap();
+        let (indexes, helpers) = extract_helpers(&tree.items);
+        let helpers = expand_helpers(&helpers);
+        for index in indexes {
+            tree.items[index] = Item::Verbatim(TokenStream::new())
+        }
+
+        // write the bindings, with the original helpers removed
+        write_to_file_fmt(
+            &generated.join("bindings.rs"),
+            &tree.to_token_stream().to_string(),
+        )?;
+
+        // write the new helpers as expanded by expand_helpers()
+        write_to_file_fmt(
+            &generated.join("helpers.rs"),
+            &format!("use super::bindings::*; {}", helpers.to_string()),
+        )?;
+
+        // write the bpf_probe_read() getters
+        let bpf_probe_read = syn::parse_str("crate::bpf_probe_read").unwrap();
+        write_to_file_fmt(
+            &generated.join("getters.rs"),
+            &format!(
+                "use super::bindings::*; {}",
+                &generate_getters_for_items(&tree.items, |getter| {
+                    read_getter(getter, &bpf_probe_read)
+                })
+                .to_string()
+            ),
+        )?;
+    }
 
     Ok(())
 }