Skip to content

Commit 2176019

Browse files
committed
Translate intrinsic names
1 parent 55da3cd commit 2176019

16 files changed

Lines changed: 77 additions & 25 deletions

charon-ml/src/GAst.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ type 'body body =
3131
| Body of 'body gexpr_body
3232
| TraitMethodWithoutDefault
3333
| Extern of string
34-
| Intrinsic of string
34+
| Intrinsic of { name : string; arg_names : string list }
3535
| Opaque
3636
| Missing
3737
| Error of error

charon-ml/src/LlbcAstUtils.ml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,12 @@ class ['self] map_crate =
9696
| Body b -> Body (self#visit_expr_body env b)
9797
| TraitMethodWithoutDefault -> TraitMethodWithoutDefault
9898
| Extern sym -> Extern (self#visit_string env sym)
99-
| Intrinsic sym -> Intrinsic (self#visit_string env sym)
99+
| Intrinsic { name; arg_names } ->
100+
Intrinsic
101+
{
102+
name = self#visit_string env name;
103+
arg_names = List.map (self#visit_string env) arg_names;
104+
}
100105
| Opaque -> Opaque
101106
| Missing -> Missing
102107
| Error err -> Error (self#visit_error env err)
@@ -231,7 +236,9 @@ class ['self] iter_crate =
231236
| Body b -> self#visit_expr_body env b
232237
| TraitMethodWithoutDefault -> ()
233238
| Extern sym -> self#visit_string env sym
234-
| Intrinsic sym -> self#visit_string env sym
239+
| Intrinsic { name; arg_names } ->
240+
self#visit_string env name;
241+
List.iter (self#visit_string env) arg_names
235242
| Opaque -> ()
236243
| Missing -> ()
237244
| Error err -> self#visit_error env err

charon-ml/src/LlbcOfJson.ml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@ let expr_body_of_json (ctx : of_json_ctx) (js : json) :
2222
| `Assoc [ ("Extern", sym) ] ->
2323
let* sym = string_of_json ctx sym in
2424
Ok (Extern sym)
25-
| `Assoc [ ("Intrinsic", name) ] ->
25+
| `Assoc
26+
[ ("Intrinsic", `Assoc [ ("name", name); ("arg_names", arg_names) ]) ]
27+
->
2628
let* name = string_of_json ctx name in
27-
Ok (Intrinsic name)
29+
let* arg_names = list_of_json string_of_json ctx arg_names in
30+
Ok (Intrinsic { name; arg_names })
2831
| `String "Opaque" -> Ok Opaque
2932
| `String "Missing" -> Ok Missing
3033
| `Assoc [ ("Error", e) ] ->

charon-ml/src/PrintGAst.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ let gfun_decl_to_string (env : 'a fmt_env) (indent : string)
125125
fun_sig_with_name_to_string env indent indent_incr
126126
(Some ("extern:" ^ sym))
127127
(Some name) None sg
128-
| Intrinsic sym ->
128+
| Intrinsic { name; _ } ->
129129
fun_sig_with_name_to_string env indent indent_incr
130-
(Some ("intrinsic:" ^ sym))
130+
(Some ("intrinsic:" ^ name))
131131
(Some name) None sg
132132
| Error err ->
133133
fun_sig_with_name_to_string env indent indent_incr

charon-ml/src/UllbcOfJson.ml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ let expr_body_of_json (ctx : of_json_ctx) (js : json) :
2020
| `Assoc [ ("Extern", sym) ] ->
2121
let* sym = string_of_json ctx sym in
2222
Ok (Extern sym)
23-
| `Assoc [ ("Intrinsic", name) ] ->
23+
| `Assoc
24+
[ ("Intrinsic", `Assoc [ ("name", name); ("arg_names", arg_names) ]) ]
25+
->
2426
let* name = string_of_json ctx name in
25-
Ok (Intrinsic name)
27+
let* arg_names = list_of_json string_of_json ctx arg_names in
28+
Ok (Intrinsic { name; arg_names })
2629
| `String "Opaque" -> Ok Opaque
2730
| `String "Missing" -> Ok Missing
2831
| `Assoc [ ("Error", e) ] ->

charon/src/ast/gast.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,17 @@ pub enum Body {
100100
/// The body of the function item we add for each trait method declaration, if the trait
101101
/// doesn't provide a default for that method.
102102
TraitMethodWithoutDefault,
103-
/// Function declared in an `extern { ... }` block. The string is the foreign symbol name.
103+
/// Function declared in an `extern { ... }` block.
104104
Extern(#[drive(skip)] String),
105105
/// Rust intrinsic function.
106-
Intrinsic(#[drive(skip)] String),
106+
Intrinsic {
107+
/// The intrinsic name.
108+
#[drive(skip)]
109+
name: String,
110+
/// The argument names, None if not available.
111+
#[drive(skip)]
112+
arg_names: Vec<Option<String>>,
113+
},
107114
/// A body that the user chose not to translate, based on opacity settings like
108115
/// `--include`/`--opaque`.
109116
Opaque,

charon/src/ast/gast_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ impl Body {
1616
Body::Unstructured(..) | Body::Structured(..) => true,
1717
Body::TraitMethodWithoutDefault
1818
| Body::Extern(..)
19-
| Body::Intrinsic(..)
19+
| Body::Intrinsic { .. }
2020
| Body::Opaque
2121
| Body::Missing
2222
| Body::Error(..) => false,

charon/src/bin/charon-driver/translate/translate_functions.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,25 @@ impl ItemTransCtx<'_, '_> {
6969
};
7070
Ok(fun_id)
7171
}
72+
73+
/// Translate the names of the arguments of this definition, if they are available,
74+
/// otherwise naming arguments `arg0`, `arg1`, etc.
75+
/// Note that the names of the arguments are not always available, even when
76+
/// we can retrieve the MIR body, in which case we also fall back to `argN`.
77+
pub fn translate_argument_names(
78+
&mut self,
79+
span: Span,
80+
def: &hax::FullDef,
81+
n_args: usize,
82+
) -> Vec<Option<String>> {
83+
let Ok(Some(body)) = self.get_mir(def.this(), span) else {
84+
return vec![None; n_args];
85+
};
86+
body.local_decls
87+
.iter_enumerated()
88+
.skip(1)
89+
.take(body.arg_count)
90+
.map(|(index, _)| hax::name_of_local(index, &body.var_debug_info))
91+
.collect()
92+
}
7293
}

charon/src/bin/charon-driver/translate/translate_items.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -604,9 +604,10 @@ impl ItemTransCtx<'_, '_> {
604604
.then(|| self.register_item(span, def.this(), TransItemSourceKind::Global));
605605

606606
let body = if let Some(name) = intrinsic_name {
607-
Body::Intrinsic(name)
608-
} else if let Some(symbol_name) = self.t_ctx.extern_item_symbol_name(def) {
609-
Body::Extern(symbol_name)
607+
let arg_names = self.translate_argument_names(span, def, signature.inputs.len());
608+
Body::Intrinsic { name, arg_names }
609+
} else if let Some(name) = self.t_ctx.extern_item_symbol_name(def) {
610+
Body::Extern(name)
610611
} else if item_meta.opacity.with_private_contents().is_opaque() {
611612
Body::Opaque
612613
} else if is_trait_method_decl_without_default {

charon/src/pretty/fmt_with_ctx.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ impl<C: AstFormatter> FmtWithCtx<C> for gast::Body {
252252
}
253253
Body::TraitMethodWithoutDefault => write!(f, "= <method_without_default_body>"),
254254
Body::Extern(name) => write!(f, "= <extern:{name}>"),
255-
Body::Intrinsic(name) => write!(f, "= <intrinsic:{name}>"),
255+
Body::Intrinsic { name, .. } => write!(f, "= <intrinsic:{name}>"),
256256
Body::Opaque => write!(f, "= <opaque>"),
257257
Body::Missing => write!(f, "= <missing>"),
258258
Body::Error(error) => write!(f, "= error(\"{}\")", error.msg),
@@ -588,9 +588,19 @@ impl<C: AstFormatter> FmtWithCtx<C> for FunDecl {
588588
let arg_names = match &self.body {
589589
Body::Unstructured(body) => args_of_locals(&body.locals),
590590
Body::Structured(body) => args_of_locals(&body.locals),
591+
Body::Intrinsic { arg_names, .. } => arg_names
592+
.iter()
593+
.enumerate()
594+
.map(|(i, name)| {
595+
let id = LocalId::new(i + 1);
596+
match name {
597+
Some(name) => format!("{name}_{id}"),
598+
None => format!("_{id}"),
599+
}
600+
})
601+
.collect(),
591602
Body::Error(..)
592603
| Body::Extern(..)
593-
| Body::Intrinsic(..)
594604
| Body::Missing
595605
| Body::Opaque
596606
| Body::TraitMethodWithoutDefault => (0..n_args)

0 commit comments

Comments
 (0)