(ast: &Node, deopt: &Deopt)
| 388 | } |
| 389 | |
| 390 | fn parse_func_gadgets_from_ast(ast: &Node, deopt: &Deopt) -> Result<Vec<FuncGadget>> { |
| 391 | let mut gadgets = Vec::new(); |
| 392 | for child in ast.inner.iter() { |
| 393 | if let Clang::LinkageSpecDecl(_) = &child.kind { |
| 394 | gadgets.extend(parse_func_gadgets_from_ast(child, deopt)?); |
| 395 | } |
| 396 | if let Clang::FunctionDecl(fd) = &child.kind { |
| 397 | let name = fd.get_name(); |
| 398 | log::trace!("parse gadget: {name}"); |
| 399 | if let Some(ban) = &deopt.config.ban { |
| 400 | if ban.contains(&name) { |
| 401 | continue; |
| 402 | } |
| 403 | } |
| 404 | let params = fd.get_params(child); |
| 405 | let alias_ret_type = fd.get_ret_type(); |
| 406 | let ret_type = to_gadget_type(&alias_ret_type)?; |
| 407 | let mut idents = vec![]; |
| 408 | let mut alias_types = vec![]; |
| 409 | let mut types = vec![]; |
| 410 | |
| 411 | for param in params { |
| 412 | let ident = param.get_name_as_string(); |
| 413 | let alias_type = param.get_sized_ty_name(deopt); |
| 414 | let ty = to_gadget_type(&alias_type)?; |
| 415 | idents.push(ident); |
| 416 | alias_types.push(alias_type); |
| 417 | types.push(ty); |
| 418 | } |
| 419 | let gadget = |
| 420 | FuncGadget::new(name, idents, types, alias_types, ret_type, alias_ret_type); |
| 421 | gadgets.push(gadget); |
| 422 | } |
| 423 | } |
| 424 | Ok(gadgets) |
| 425 | } |
| 426 | |
| 427 | pub fn dump_func_gadgets(gadgets: &Vec<FuncGadget>, deopt: &Deopt) -> Result<()> { |
| 428 | let save_path = deopt.get_library_func_gadget_path()?; |
no test coverage detected