Unverified Commit a8fb540b by Melvin Klimke Committed by GitHub

Refactored Cconv

parent 4e30a70d
......@@ -2,6 +2,7 @@
(section etc)
(files
(src/config.json as config.json)
(src/utils/registers.json as registers.json)
)
)
......
......@@ -6,93 +6,117 @@ let dyn_syms = ref None
let callee_saved_registers = ref None
(** Return a list of registers that are callee-saved.
TODO: At least ARMv7 and PPC have floating point registers that are callee saved. Check their names in bap and then add them. *)
let callee_saved_register_list project =
let arch = Project.arch project in
match arch with
| `x86_64 -> (* System V ABI *)
"RBX" :: "RSP" :: "RBP" :: "R12" :: "R13" :: "R14" :: "R15" :: []
(* Microsoft x64 calling convention. Unused at the moment, since Windows binaries are not yet supported.
| `x86_64 -> (* Microsoft x64 calling convention *)
"RBX" :: "RBP" :: "RDI" :: "RSI" :: "RSP" :: "R12" :: "R13" :: "R14" :: "R15" :: []
*)
| `x86 -> (* Both Windows and Linux save the same registers *)
"EBX" :: "ESI" :: "EDI" :: "EBP" :: []
| `armv4 | `armv5 | `armv6 | `armv7
| `armv4eb | `armv5eb | `armv6eb | `armv7eb
| `thumbv4 | `thumbv5 | `thumbv6 | `thumbv7
| `thumbv4eb | `thumbv5eb | `thumbv6eb | `thumbv7eb -> (* ARM 32bit. R13 and SP are both names for the stack pointer. *)
"R4" :: "R5" :: "R6" :: "R7" :: "R8" :: "R9" :: "R10" :: "R11" :: "R13" :: "SP" :: []
| `aarch64 | `aarch64_be -> (* ARM 64bit *) (* TODO: This architecture is not contained in the acceptance tests yet? *)
"X19" :: "X20" :: "X21" :: "X22" :: "X23" :: "X24" :: "X25" :: "X26" :: "X27" :: "X28" :: "X29" :: "SP" :: []
| `ppc (* 32bit PowerPC *) (* TODO: add floating point registers. *) (* TODO: add CR2, CR3, CR4. Test their representation in bap first. *)
| `ppc64 | `ppc64le -> (* 64bit PowerPC *)
"R14" :: "R15" :: "R16" :: "R17" :: "R18" :: "R19" :: "R20" :: "R21" :: "R22" :: "R23" ::
"R24" :: "R25" :: "R26" :: "R27" :: "R28" :: "R29" :: "R30" :: "R31" :: "R1" :: "R2" :: []
| `mips | `mips64 | `mips64el | `mipsel -> (* S8 and FP are the same register. bap uses FP, S8 is left there just in case. *)
"S0" :: "S1" :: "S2" :: "S3" :: "S4" :: "S5" :: "S6" :: "S7" :: "S8" :: "GP" :: "SP" :: "FP" :: []
| _ -> failwith "No calling convention implemented for the given architecture."
let bin_format = ref ""
let json = ref None
let get_json (() : unit) : Yojson.Basic.t =
match !json with
| Some(json) -> !json
| None -> begin
let path = match Sys.getenv_opt "OPAM_SWITCH_PREFIX" with
| Some(prefix) -> prefix ^ "/etc/cwe_checker/registers.json"
| None -> failwith "[cwe_checker] registers.json not found." in
Yojson.Basic.from_file path
end
let supported_architectures = ref []
let get_supported_architectures (() : unit) : string list =
match !supported_architectures with
| [] -> begin
supported_architectures := List.append !supported_architectures (List.map (Json_utils.get_arch_list_from_json (get_json ()) "elf") ~f:(fun kv -> match kv with (k, _) -> k));
!supported_architectures
end
| _ -> !supported_architectures
let call_objdump (proj : Project.t) ~flag:(flag : string) ~err:(err : string) : string list =
match Project.get proj filename with
| None -> failwith "[cwe_checker] Project has no file name."
| Some(fname) -> begin
try
let cmd = Format.sprintf ("objdump %s %s") flag fname in
let in_chan = Unix.open_process_in cmd in
let lines = In_channel.input_lines in_chan in
let () = In_channel.close in_chan in
lines
with
Unix.Unix_error (e,fm,argm) ->
failwith (Format.sprintf "%s %s %s %s" err (Unix.error_message e) fm argm)
end
let infer_bin_format_from_symbols (project : Project.t) : string =
match Option.is_some (Symtab.find_by_name (Project.symbols project) "__GetPEImageBase") with
| true -> "pe"
| false -> "elf"
let extract_bin_format (project : Project.t) : string =
match !bin_format with
| "" -> begin
let header = call_objdump project ~flag:"-f" ~err:"[cwe_checker] Parsing of file header failed:" in
let arch = Project.arch project in
match header with
| _::line::_ -> begin
let chop_idx = match arch with
| `x86_64 -> 2
| _ -> 1 in
match List.hd_exn (List.drop (List.rev (String.split_on_chars line ~on:[' '; '-'])) chop_idx) with
| "elf32" | "elf64" -> bin_format := "elf"; !bin_format
| "pei" -> bin_format := "pe"; !bin_format
| _ -> infer_bin_format_from_symbols project
end
| _ -> infer_bin_format_from_symbols project
end
| _ -> !bin_format
let get_register_list (project : Project.t) (context : string) : string list =
let bap_arch = Arch.to_string (Project.arch project) in
let arch = match bap_arch with
| "i386" | "i686" -> "x86"
| "powerpc" -> "ppc"
| _ -> bap_arch in
match Stdlib.List.mem arch (get_supported_architectures ()) with
| true -> begin
let json_bin = Json_utils.get_bin_format_from_json (get_json ()) (extract_bin_format project) in
match arch with
| "x86" -> begin
let conv = match Project.get project Bap_abi.name with
| Some(c) -> c
| _ -> Log_utils.info "[cwe_checker] Could not infer calling convention. Assuming cdecl as standard"; "cdecl" in
let json_arch = Json_utils.get_arch_from_json json_bin ~conv:conv arch in
Json_utils.get_registers_from_json json_arch context
end
| _ -> begin
let json_arch = Json_utils.get_arch_from_json json_bin arch in
Json_utils.get_registers_from_json json_arch context
end
end
| false -> failwith "No calling convention implemented for the given architecture"
let is_callee_saved var project =
match !callee_saved_registers with
| Some(register_set) -> String.Set.mem register_set (Var.name var)
| None ->
callee_saved_registers := Some(String.Set.of_list (callee_saved_register_list project));
callee_saved_registers := Some(String.Set.of_list (get_register_list project "callee_saved"));
String.Set.mem (Option.value_exn !callee_saved_registers) (Var.name var)
(** Return a list of all registers that may hold function arguments. *)
let get_parameter_register_list (project: Project.t) : String.t List.t =
let architecture = Project.arch project in
match architecture with
| `x86 ->
[] (* TODO: This is the value for the standard C calling convention. But it is incorrect for some of the other calling conventions for x86! *)
| `x86_64 -> (* System V ABI. TODO: Floationg Point registers are mising! TODO: Microsoft calling convention uses different register. *)
"RDI" :: "RSI" :: "RDX" :: "RCX" :: "R8" :: "R9" :: []
| `armv4 | `armv5 | `armv6 | `armv7
| `armv4eb | `armv5eb | `armv6eb | `armv7eb
| `thumbv4 | `thumbv5 | `thumbv6 | `thumbv7
| `thumbv4eb | `thumbv5eb | `thumbv6eb | `thumbv7eb ->
"R0" :: "R1" :: "R2" :: "R3" :: []
| `aarch64 | `aarch64_be -> (* ARM 64bit *)
"X0" :: "X1" :: "X2" :: "X3" :: "X4" :: "X5" :: "X6" :: "X7" :: []
| `ppc (* 32bit PowerPC *) (* TODO: add floating point register! *)
| `ppc64 | `ppc64le -> (* 64bit PowerPC *)
"R3" :: "R4" :: "R5" :: "R6" :: "R7" :: "R8" :: "R9" :: "R10" :: []
| `mips | `mips64 | `mips64el | `mipsel -> (* TODO: MIPS has also a calling convention with less arguments. TODO: check whether BAP actually uses A4-A7 as register names or gives them different names *)
"A0" :: "A1" :: "A2" :: "A3" :: "A4" :: "A5" :: "A6" :: "A7" :: []
| _ -> failwith "No calling convention implemented for the given architecture"
let is_parameter_register (var: Var.t) (project: Project.t) : Bool.t =
let param_register = get_parameter_register_list project in
let param_register = get_register_list project "params" in
Option.is_some (List.find param_register ~f:(String.equal (Var.name var)))
(** Return all registers that may contain return values of function calls *) (* TODO: Add Floating Point register! *)
let get_return_register_list (project: Project.t) : String.t List.t =
let architecture = Project.arch project in
match architecture with
| `x86 ->
"EAX" :: []
| `x86_64 -> (* System V ABI *)
"RAX" :: "RDX" :: []
| `armv4 | `armv5 | `armv6 | `armv7
| `armv4eb | `armv5eb | `armv6eb | `armv7eb
| `thumbv4 | `thumbv5 | `thumbv6 | `thumbv7
| `thumbv4eb | `thumbv5eb | `thumbv6eb | `thumbv7eb ->
"R0" :: "R1" :: "R2" :: "R3" :: []
| `aarch64 | `aarch64_be -> (* ARM 64bit *)
"X0" :: "X1" :: "X2" :: "X3" :: "X4" :: "X5" :: "X6" :: "X7" :: []
| `ppc (* 32bit PowerPC *) (* TODO: add floating point register! *)
| `ppc64 | `ppc64le -> (* 64bit PowerPC *)
"R3" :: "R4" :: []
| `mips | `mips64 | `mips64el | `mipsel ->
"V0" :: "V1" :: []
| _ -> failwith "No calling convention implemented for the given architecture"
let is_return_register (var: Var.t) (project: Project.t) : Bool.t =
let ret_register = get_return_register_list project in
let ret_register = get_register_list project "return" in
Option.is_some (List.find ret_register ~f:(String.equal (Var.name var)))
(** Parse a line from the dyn-syms output table of objdump. Return the name of a symbol if the symbol is an extern function name. *)
let parse_dyn_sym_line (line : string) : string option =
let line = ref (String.strip line) in
......@@ -116,28 +140,18 @@ let parse_dyn_sym_line (line : string) : string option =
end
| _ -> None
let parse_dyn_syms (project : Project.t) : String.Set.t =
match !dyn_syms with
| Some(symbol_set) -> symbol_set
| None ->
match Project.get project filename with
| None -> failwith "[CWE-checker] Project has no file name."
| Some(fname) -> begin
let cmd = Format.sprintf "objdump --dynamic-syms %s" fname in
try
let in_chan = Unix.open_process_in cmd in
let lines = In_channel.input_lines in_chan in
let () = In_channel.close in_chan in begin
match lines with
| _ :: _ :: _ :: _ :: tail -> (* The first four lines are not part of the table *)
let symbol_set = String.Set.of_list (List.filter_map tail ~f:parse_dyn_sym_line) in
dyn_syms := Some(symbol_set);
symbol_set
| _ ->
dyn_syms := Some(String.Set.empty);
String.Set.empty (* *)
end
with
Unix.Unix_error (e,fm,argm) ->
failwith (Format.sprintf "[CWE-checker] Parsing of dynamic symbols failed: %s %s %s" (Unix.error_message e) fm argm)
end
| None -> begin
let lines = call_objdump project ~flag:"--dynamic-syms" ~err:"[cwe_checker] Parsing of dynamic symbols failed:" in
match lines with
| _ :: _ :: _ :: _ :: tail -> (* The first four lines are not part of the table *)
let symbol_set = String.Set.of_list (List.filter_map tail ~f:parse_dyn_sym_line) in
dyn_syms := Some(symbol_set);
symbol_set
| _ ->
dyn_syms := Some(String.Set.empty);
String.Set.empty
end
......@@ -2,6 +2,10 @@ open Bap.Std
open Core_kernel
(** Returns a json object for registers.json. If not yet in memory, the json file is read. *)
val get_json: unit -> Yojson.Basic.t
(** Returns whether a variable is callee saved according to the calling convention
of the target architecture. Should only used for calls to functions outside
of the program, not for calls between functions inside the program. *)
......@@ -22,3 +26,24 @@ val is_return_register: Var.t -> Project.t -> Bool.t
TODO: Since we do not do name demangling here, check whether bap name demangling
yields different function names for the symbols. *)
val parse_dyn_syms: Project.t -> String.Set.t
(** Returns a string list of supported architectures from the registers.json. *)
val get_supported_architectures : unit -> string list
(** Calls objdump with customisable flag and error message. Returns output lines as string list. *)
val call_objdump : Project.t -> flag:string -> err:string -> string list
(** Infers the binary format using the file's symbol table. *)
val infer_bin_format_from_symbols : Project.t -> string
(** Returns the binary format by either an objdump call or via the file's symbol table. *)
val extract_bin_format : Project.t -> string
(** Returns a list of registers based on the file's binary format, architecture,
calling_convention and context (e.g. callee saved, parameter etc.) *)
val get_register_list : Project.t -> string -> string list
......@@ -10,23 +10,43 @@ An example looks like this:
"memcpy", "wmemcpy", "memmove", "wmemmove", "memcmp", "wmemcmp"],
"_comment": "any function that takes something of type size_t could be a possible candidate."
}, *)
let get_symbols_from_json json cwe =
let get_symbols_from_json (json : Yojson.Basic.t) cwe =
[json]
|> filter_member cwe
|> filter_member "symbols"
|> flatten
|> List.map ~f:to_string
let get_symbol_lists_from_json json cwe =
let get_symbol_lists_from_json (json : Yojson.Basic.t) cwe =
[json]
|> filter_member cwe
|> filter_member "pairs"
|> flatten
|> List.map ~f:(fun l -> List.map (to_list l) ~f:to_string)
let get_parameter_list_from_json json cwe =
let get_parameter_list_from_json (json : Yojson.Basic.t) cwe =
[json]
|> filter_member cwe
|> filter_member "parameters"
|> flatten
|> List.map ~f:to_string
let get_arch_from_json (bin_format : Yojson.Basic.t) ?(conv : string = "") (arch : string) : Yojson.Basic.t =
match arch with
| "x86" -> bin_format |> member arch |> member conv
| _ -> bin_format |> member arch
let get_bin_format_from_json (json : Yojson.Basic.t) (bin_format : string) : Yojson.Basic.t =
json |> member bin_format
let get_registers_from_json (arch : Yojson.Basic.t) (context : string) : string list =
arch |> member context |> to_list |> filter_string
let get_arch_list_from_json (json : Yojson.Basic.t) (bin_format : string) : (string * Yojson.Basic.t) list =
json |> member bin_format |> to_assoc
(* This module implements functionality related to parsing the JSON configuration file. *)
(** Returns pairs of symbols for a given CWE check. *)
val get_symbol_lists_from_json : Yojson.Basic.t -> string -> string list list
(** Returns symbols for a given CWE check. *)
val get_symbols_from_json : Yojson.Basic.t -> string -> string list
(** Returns parameters for a given CWE check. *)
val get_parameter_list_from_json : Yojson.Basic.t -> string -> string list
(** Returns an architecture's registers based on calling convention. *)
val get_arch_from_json : Yojson.Basic.t -> ?conv:string -> string -> Yojson.Basic.t
(** Returns json object containing either PE or ELF calling conventions for all architectures. *)
val get_bin_format_from_json : Yojson.Basic.t -> string -> Yojson.Basic.t
(** Returns registers for a given architecture and calling_convention specified by context. (e.g. callee saved, parameter etc.) *)
val get_registers_from_json : Yojson.Basic.t -> string -> string list
(** Returns a list of all architectures supported for a given binary format. (e.g. ELF) *)
val get_arch_list_from_json : Yojson.Basic.t -> string -> (string * Yojson.Basic.t) list
{
"pe" : {
"x86" : {
"cdecl" : {
"callee_saved" : ["EBX", "ESI", "EDI", "EBP"],
"float_callee_saved" : [],
"params" : [],
"float_params" : [],
"return" : ["EDX", "EAX"],
"float_return" : ["ST0"]
},
"ms" : {
"callee_saved" : ["EBX", "ESI", "EDI", "EBP"],
"float_callee_saved" : [],
"params" : [],
"float_params" : [],
"return" : ["EDX", "EAX"],
"float_return" : ["ST0"]
},
"fastcall" : {
"callee_saved" : ["EBX", "ESI", "EDI", "EBP"],
"float_callee_saved" : [],
"params" : ["ECX", "EDX"],
"float_params" : [],
"return" : ["EDX", "EAX"],
"float_return" : ["ST0"]
}
},
"x86_64" : {
"callee_saved" : ["RBX", "RBP", "RSP", "RDI", "RSI", "R12", "R13", "R14", "R15"],
"float_callee_saved" : ["XMM6", "XMM7", "XMM8", "XMM9", "XMM10", "XMM11", "XMM12", "XXM13", "XMM14", "XMM15"],
"params" : ["RCX", "RDX", "R8", "R9"],
"float_params" : ["XMM0", "XMM1", "XMM2", "XMM3", "YMM0", "YMM1", "YMM2", "YMM3", "ZMM0", "ZMM1", "ZMM2", "ZMM3"],
"return" : ["RAX"],
"float_return" : ["XMM0", "YMM0", "ZMM0"]
},
"armv4" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"armv5" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"armv6" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"armv7" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"armv4eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"armv5eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"armv6eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"armv7eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"thumbv4" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"thumbv5" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"thumbv6" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"thumbv7" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"thumbv4eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"thumbv5eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"thumbv6eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"thumbv7eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "D0", "D1", "Q0"]
},
"aarch64" : {
"callee_saved" : ["X18", "X19", "X20", "X21", "X22", "X23", "X24", "X25", "X26", "X27", "X28", "X29", "SP", "X30", "LR",
"W19", "W20", "W21", "W22", "W23", "W24", "W25", "W26", "W27", "W28", "W29", "W30"],
"float_callee_saved" : ["V8", "V9", "V10", "V11", "V12", "V13", "V14", "V15"],
"params" : ["X0", "X1", "X2", "X3", "X4", "X5", "X6", "X7", "W0", "W1", "W2", "W3", "W4", "W5", "W6", "W7"],
"float_params" : ["V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7"],
"return" : ["X0", "W0"],
"float_return" : ["V0"]
},
"aarch64_be" : {
"callee_saved" : ["X18", "X19", "X20", "X21", "X22", "X23", "X24", "X25", "X26", "X27", "X28", "X29", "SP", "X30", "LR",
"W19", "W20", "W21", "W22", "W23", "W24", "W25", "W26", "W27", "W28", "W29", "W30"],
"float_callee_saved" : ["V8", "V9", "V10", "V11", "V12", "V13", "V14", "V15"],
"params" : ["X0", "X1", "X2", "X3", "X4", "X5", "X6", "X7", "W0", "W1", "W2", "W3", "W4", "W5", "W6", "W7"],
"float_params" : ["V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7"],
"return" : ["X0", "W0"],
"float_return" : ["V0"]
},
"ppc" : {
"callee_saved" : [],
"float_callee_saved" : [],
"params" : [],
"float_params" : [],
"return" : [],
"float_return" : []
},
"ppc64" : {
"callee_saved" : [],
"float_callee_saved" : [],
"params" : [],
"float_params" : [],
"return" : [],
"float_return" : []
},
"ppc64le" : {
"callee_saved" : [],
"float_callee_saved" : [],
"params" : [],
"float_params" : [],
"return" : [],
"float_return" : []
},
"mips" : {
"callee_saved" : [],
"float_callee_saved" : [],
"params" : [],
"float_params" : [],
"return" : [],
"float_return" : []
},
"mipsel" : {
"callee_saved" : [],
"float_callee_saved" : [],
"params" : [],
"float_params" : [],
"return" : [],
"float_return" : []
},
"mips64" : {
"callee_saved" : [],
"float_callee_saved" : [],
"params" : [],
"float_params" : [],
"return" : [],
"float_return" : []
},
"mips64el" : {
"callee_saved" : [],
"float_callee_saved" : [],
"params" : [],
"float_params" : [],
"return" : [],
"float_return" : []
}
},
"elf" : {
"x86" : {
"cdecl" : {
"callee_saved" : ["EBX", "ESI", "EDI", "EBP"],
"float_callee_saved" : [],
"params" : [],
"float_params" : [],
"return" : ["EDX", "EAX"],
"float_return" : ["ST0"]
},
"stdcall" : {
"callee_saved" : ["EBX", "ESI", "EDI", "EBP"],
"float_callee_saved" : [],
"params" : [],
"float_params" : [],
"return" : ["EDX", "EAX"],
"float_return" : ["ST0"]
},
"fastcall" : {
"callee_saved" : ["EBX", "ESI", "EDI", "EBP"],
"float_callee_saved" : [],
"params" : ["ECX", "EDX"],
"float_params" : [],
"return" : ["EDX", "EAX"],
"float_return" : ["ST0"]
}
},
"x86_64" : {
"callee_saved" : ["RBP", "RSP", "RBX", "R12", "R13", "R14", "R15"],
"float_callee_saved" : [],
"params" : ["RDI", "RSI", "RDX", "RCX", "R8", "R9"],
"float_params" : ["XMM0", "XMM1", "XMM2", "XMM3", "XMM4", "XMM5", "XMM6", "XMM7",
"YMM0", "YMM1", "YMM2", "YMM3", "YMM4", "YMM5", "YMM6", "YMM7",
"ZMM0", "ZMM1", "ZMM2", "ZMM3", "ZMM4", "ZMM5", "ZMM6", "ZMM7"],
"return" : ["RAX", "RDX"],
"float_return" : ["XMM0", "XMM1", "YMM0", "ZMM0", "ST0", "ST1"]
},
"armv4" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"armv5" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"armv6" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"armv7" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"armv4eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"armv5eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"armv6eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"armv7eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"thumbv4" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"thumbv5" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"thumbv6" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"thumbv7" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"thumbv4eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"thumbv5eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"thumbv6eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"thumbv7eb" : {
"callee_saved" : ["R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R13", "SP", "R14", "LR"],
"float_callee_saved" : ["S16", "S17", "S18", "S19", "S20", "S21", "S22", "S23",
"S24", "S25", "S26", "S27", "S28", "S29", "S30", "S31",
"D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15", "Q4", "Q5", "Q6", "Q7"],
"params" : ["R0", "R1", "R2", "R3"],
"float_params" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"],
"return" : ["R0", "R1", "R2", "R3"],
"float_return" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9",
"S10", "S11", "S12", "S13", "S14", "S15", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"Q0", "Q1", "Q2", "Q3"]
},
"aarch64" : {
"callee_saved" : ["X18", "X19", "X20", "X21", "X22", "X23", "X24", "X25", "X26", "X27", "X28", "X29", "SP", "X30", "LR",
"W19", "W20", "W21", "W22", "W23", "W24", "W25", "W26", "W27", "W28", "W29", "W30"],
"float_callee_saved" : ["V8", "V9", "V10", "V11", "V12", "V13", "V14", "V15"],
"params" : ["X0", "X1", "X2", "X3", "X4", "X5", "X6", "X7", "W0", "W1", "W2", "W3", "W4", "W5", "W6", "W7"],
"float_params" : ["V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7"],
"return" : ["X0", "X1", "X2", "X3", "X4", "X5", "X6", "X7", "W0", "W1", "W2", "W3", "W4", "W5", "W6", "W7"],
"float_return" : ["V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7"]
},
"aarch64_be" : {
"callee_saved" : ["X18", "X19", "X20", "X21", "X22", "X23", "X24", "X25", "X26", "X27", "X28", "X29", "SP", "X30", "LR",
"W19", "W20", "W21", "W22", "W23", "W24", "W25", "W26", "W27", "W28", "W29", "W30"],
"float_callee_saved" : ["V8", "V9", "V10", "V11", "V12", "V13", "V14", "V15"],
"params" : ["X0", "X1", "X2", "X3", "X4", "X5", "X6", "X7", "W0", "W1", "W2", "W3", "W4", "W5", "W6", "W7"],
"float_params" : ["V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7"],
"return" : ["X0", "X1", "X2", "X3", "X4", "X5", "X6", "X7", "W0", "W1", "W2", "W3", "W4", "W5", "W6", "W7"],
"float_return" : ["V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7"]
},
"ppc" : {
"callee_saved" : ["R14", "R15", "R16", "R17", "R18", "R19", "R20", "R21",
"R22", "R23", "R24", "R25", "R26", "R27", "R28", "R29", "R30", "R31"],
"float_callee_saved" : ["F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21",
"F22", "F23", "F24", "F25", "F26", "F27", "F28", "F29", "F30", "F31"],
"params" : ["R3", "R4", "R5", "R6", "R7", "R8", "R9", "R10"],
"float_params" : ["F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9",
"F10", "F11", "F12", "F13"],
"return" : ["R3", "R4"],
"float_return" : ["F1", "F2", "F3", "F4"]
},
"ppc64" : {
"callee_saved" : ["R1", "R2", "R14", "R15", "R16", "R17", "R18", "R19", "R20", "R21",
"R22", "R23", "R24", "R25", "R26", "R27", "R28", "R29", "R30", "R31"],
"float_callee_saved" : ["F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21",
"F22", "F23", "F24", "F25", "F26", "F27", "F28", "F29", "F30", "F31"],
"params" : ["R3", "R4", "R5", "R6", "R7", "R8", "R9", "R10"],
"float_params" : ["F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9",
"F10", "F11", "F12", "F13"],
"return" : ["R3", "R4"],
"float_return" : ["F1", "F2", "F3", "F4"]
},
"ppc64le" : {
"callee_saved" : ["R1", "R2", "R14", "R15", "R16", "R17", "R18", "R19", "R20", "R21",
"R22", "R23", "R24", "R25", "R26", "R27", "R28", "R29", "R30", "R31"],
"float_callee_saved" : ["F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21",
"F22", "F23", "F24", "F25", "F26", "F27", "F28", "F29", "F30", "F31"],
"params" : ["R3", "R4", "R5", "R6", "R7", "R8", "R9", "R10"],
"float_params" : ["F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9",
"F10", "F11", "F12", "F13"],
"return" : ["R3", "R4"],
"float_return" : ["F1", "F2", "F3", "F4"]
},
"mips" : {
"callee_saved" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "GP", "SP", "FP"],
"float_callee_saved" : ["F20", "F21", "F22", "F23", "F24", "F25", "F26",
"F27", "F28", "F29", "F30"],
"params" : ["A0", "A1", "A2", "A3"],
"float_params" : ["F12", "F13", "F14"],
"return" : ["V0", "V1"],
"float_return" : ["F0", "F1", "F2", "F3"]
},
"mipsel" : {
"callee_saved" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "GP", "SP", "FP"],
"float_callee_saved" : ["F20", "F21", "F22", "F23", "F24", "F25", "F26",
"F27", "F28", "F29", "F30"],
"params" : ["A0", "A1", "A2", "A3"],
"float_params" : ["F12", "F13", "F14"],
"return" : ["V0", "V1"],
"float_return" : ["F0", "F1", "F2", "F3"]
},
"mips64" : {
"callee_saved" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "GP", "SP", "FP"],
"float_callee_saved" : ["F20", "F21", "F22", "F23", "F24", "F25", "F26",
"F27", "F28", "F29", "F30"],
"params" : ["A0", "A1", "A2", "A3"],
"float_params" : ["F12", "F13", "F14"],
"return" : ["V0", "V1"],
"float_return" : ["F0", "F1", "F2", "F3"]
},
"mips64el" : {
"callee_saved" : ["S0", "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "GP", "SP", "FP"],
"float_callee_saved" : ["F20", "F21", "F22", "F23", "F24", "F25", "F26",
"F27", "F28", "F29", "F30"],
"params" : ["A0", "A1", "A2", "A3"],
"float_params" : ["F12", "F13", "F14"],
"return" : ["V0", "V1"],
"float_return" : ["F0", "F1", "F2", "F3"]
}
}
}
......@@ -13,8 +13,12 @@ let test_callee_saved () =
let project = Option.value_exn !example_project in
let register = Var.create "RBX" (Bil.Imm (Symbol_utils.arch_pointer_size_in_bytes project * 8)) in
let () = check "callee_saved_register" (is_callee_saved register project) in
let register = Var.create "R15" (Bil.Imm (Symbol_utils.arch_pointer_size_in_bytes project * 8)) in
let () = check "callee_saved_register" (is_callee_saved register project) in
let register = Var.create "RAX" (Bil.Imm (Symbol_utils.arch_pointer_size_in_bytes project * 8)) in
let () = check "caller_saved_register" (is_callee_saved register project = false) in
let register = Var.create "R8" (Bil.Imm (Symbol_utils.arch_pointer_size_in_bytes project * 8)) in
let () = check "caller_saved_register" (is_callee_saved register project = false) in
()
let test_parameter_register () =
......@@ -22,8 +26,12 @@ let test_parameter_register () =
let project = Option.value_exn !example_project in
let register = Var.create "RDX" (Bil.Imm (Symbol_utils.arch_pointer_size_in_bytes project * 8)) in
let () = check "return_register" (is_parameter_register register project) in
let register = Var.create "R9" (Bil.Imm (Symbol_utils.arch_pointer_size_in_bytes project * 8)) in
let () = check "return_register" (is_parameter_register register project) in
let register = Var.create "RAX" (Bil.Imm (Symbol_utils.arch_pointer_size_in_bytes project * 8)) in
let () = check "no_return_register" (is_parameter_register register project = false) in
let register = Var.create "R14" (Bil.Imm (Symbol_utils.arch_pointer_size_in_bytes project * 8)) in
let () = check "no_return_register" (is_parameter_register register project = false) in
()
let test_return_register () =
......@@ -35,6 +43,7 @@ let test_return_register () =
let () = check "no_return_register" (is_return_register register project = false) in
()
let test_parse_dyn_syms () =
(* this test assumes, that the example project is the arrays_x64.out binary from the artificial samples. *)
let project = Option.value_exn !example_project in
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment