Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
cwe_checker
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fact-gitdep
cwe_checker
Commits
a8fb540b
Unverified
Commit
a8fb540b
authored
May 14, 2020
by
Melvin Klimke
Committed by
GitHub
May 14, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactored Cconv
parent
4e30a70d
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
833 additions
and
87 deletions
+833
-87
dune
dune
+1
-0
cconv.ml
src/utils/cconv.ml
+98
-84
cconv.mli
src/utils/cconv.mli
+25
-0
json_utils.ml
src/utils/json_utils.ml
+23
-3
json_utils.mli
src/utils/json_utils.mli
+24
-0
registers.json
src/utils/registers.json
+653
-0
cconv_test.ml
test/unit/utils/cconv_test.ml
+9
-0
No files found.
dune
View file @
a8fb540b
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
(section etc)
(section etc)
(files
(files
(src/config.json as config.json)
(src/config.json as config.json)
(src/utils/registers.json as registers.json)
)
)
)
)
...
...
src/utils/cconv.ml
View file @
a8fb540b
...
@@ -6,93 +6,117 @@ let dyn_syms = ref None
...
@@ -6,93 +6,117 @@ let dyn_syms = ref None
let
callee_saved_registers
=
ref
None
let
callee_saved_registers
=
ref
None
(** Return a list of registers that are callee-saved.
let
bin_format
=
ref
""
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
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
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
match
arch
with
|
`x86_64
->
(* System V ABI *)
|
"x86"
->
begin
"RBX"
::
"RSP"
::
"RBP"
::
"R12"
::
"R13"
::
"R14"
::
"R15"
::
[]
let
conv
=
match
Project
.
get
project
Bap_abi
.
name
with
(* Microsoft x64 calling convention. Unused at the moment, since Windows binaries are not yet supported.
|
Some
(
c
)
->
c
| `x86_64 -> (* Microsoft x64 calling convention *)
|
_
->
Log_utils
.
info
"[cwe_checker] Could not infer calling convention. Assuming cdecl as standard"
;
"cdecl"
in
"RBX" :: "RBP" :: "RDI" :: "RSI" :: "RSP" :: "R12" :: "R13" :: "R14" :: "R15" :: []
let
json_arch
=
Json_utils
.
get_arch_from_json
json_bin
~
conv
:
conv
arch
in
*)
Json_utils
.
get_registers_from_json
json_arch
context
|
`x86
->
(* Both Windows and Linux save the same registers *)
end
"EBX"
::
"ESI"
::
"EDI"
::
"EBP"
::
[]
|
_
->
begin
|
`armv4
|
`armv5
|
`armv6
|
`armv7
let
json_arch
=
Json_utils
.
get_arch_from_json
json_bin
arch
in
|
`armv4eb
|
`armv5eb
|
`armv6eb
|
`armv7eb
Json_utils
.
get_registers_from_json
json_arch
context
|
`thumbv4
|
`thumbv5
|
`thumbv6
|
`thumbv7
end
|
`thumbv4eb
|
`thumbv5eb
|
`thumbv6eb
|
`thumbv7eb
->
(* ARM 32bit. R13 and SP are both names for the stack pointer. *)
end
"R4"
::
"R5"
::
"R6"
::
"R7"
::
"R8"
::
"R9"
::
"R10"
::
"R11"
::
"R13"
::
"SP"
::
[]
|
false
->
failwith
"No calling convention implemented for the given architecture"
|
`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
is_callee_saved
var
project
=
let
is_callee_saved
var
project
=
match
!
callee_saved_registers
with
match
!
callee_saved_registers
with
|
Some
(
register_set
)
->
String
.
Set
.
mem
register_set
(
Var
.
name
var
)
|
Some
(
register_set
)
->
String
.
Set
.
mem
register_set
(
Var
.
name
var
)
|
None
->
|
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
)
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
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
)))
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
is_return_register
(
var
:
Var
.
t
)
(
project
:
Project
.
t
)
:
Bool
.
t
=
let
ret_register
=
get_re
turn_register_list
project
in
let
ret_register
=
get_re
gister_list
project
"return"
in
Option
.
is_some
(
List
.
find
ret_register
~
f
:
(
String
.
equal
(
Var
.
name
var
)))
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. *)
(** 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
parse_dyn_sym_line
(
line
:
string
)
:
string
option
=
let
line
=
ref
(
String
.
strip
line
)
in
let
line
=
ref
(
String
.
strip
line
)
in
...
@@ -116,18 +140,12 @@ let parse_dyn_sym_line (line : string) : string option =
...
@@ -116,18 +140,12 @@ let parse_dyn_sym_line (line : string) : string option =
end
end
|
_
->
None
|
_
->
None
let
parse_dyn_syms
(
project
:
Project
.
t
)
:
String
.
Set
.
t
=
let
parse_dyn_syms
(
project
:
Project
.
t
)
:
String
.
Set
.
t
=
match
!
dyn_syms
with
match
!
dyn_syms
with
|
Some
(
symbol_set
)
->
symbol_set
|
Some
(
symbol_set
)
->
symbol_set
|
None
->
|
None
->
begin
match
Project
.
get
project
filename
with
let
lines
=
call_objdump
project
~
flag
:
"--dynamic-syms"
~
err
:
"[cwe_checker] Parsing of dynamic symbols failed:"
in
|
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
match
lines
with
|
_
::
_
::
_
::
_
::
tail
->
(* The first four lines are not part of the table *)
|
_
::
_
::
_
::
_
::
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
let
symbol_set
=
String
.
Set
.
of_list
(
List
.
filter_map
tail
~
f
:
parse_dyn_sym_line
)
in
...
@@ -135,9 +153,5 @@ let parse_dyn_syms (project : Project.t) : String.Set.t =
...
@@ -135,9 +153,5 @@ let parse_dyn_syms (project : Project.t) : String.Set.t =
symbol_set
symbol_set
|
_
->
|
_
->
dyn_syms
:=
Some
(
String
.
Set
.
empty
);
dyn_syms
:=
Some
(
String
.
Set
.
empty
);
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
end
src/utils/cconv.mli
View file @
a8fb540b
...
@@ -2,6 +2,10 @@ open Bap.Std
...
@@ -2,6 +2,10 @@ open Bap.Std
open
Core_kernel
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
(** 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 target architecture. Should only used for calls to functions outside
of the program, not for calls between functions inside the program. *)
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
...
@@ -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
TODO: Since we do not do name demangling here, check whether bap name demangling
yields different function names for the symbols. *)
yields different function names for the symbols. *)
val
parse_dyn_syms
:
Project
.
t
->
String
.
Set
.
t
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
src/utils/json_utils.ml
View file @
a8fb540b
...
@@ -10,23 +10,43 @@ An example looks like this:
...
@@ -10,23 +10,43 @@ An example looks like this:
"memcpy", "wmemcpy", "memmove", "wmemmove", "memcmp", "wmemcmp"],
"memcpy", "wmemcpy", "memmove", "wmemmove", "memcmp", "wmemcmp"],
"_comment": "any function that takes something of type size_t could be a possible candidate."
"_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
]
[
json
]
|>
filter_member
cwe
|>
filter_member
cwe
|>
filter_member
"symbols"
|>
filter_member
"symbols"
|>
flatten
|>
flatten
|>
List
.
map
~
f
:
to_string
|>
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
]
[
json
]
|>
filter_member
cwe
|>
filter_member
cwe
|>
filter_member
"pairs"
|>
filter_member
"pairs"
|>
flatten
|>
flatten
|>
List
.
map
~
f
:
(
fun
l
->
List
.
map
(
to_list
l
)
~
f
:
to_string
)
|>
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
]
[
json
]
|>
filter_member
cwe
|>
filter_member
cwe
|>
filter_member
"parameters"
|>
filter_member
"parameters"
|>
flatten
|>
flatten
|>
List
.
map
~
f
:
to_string
|>
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
src/utils/json_utils.mli
View file @
a8fb540b
(* This module implements functionality related to parsing the JSON configuration file. *)
(* 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
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
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
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
src/utils/registers.json
0 → 100644
View file @
a8fb540b
{
"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"
]
}
}
}
test/unit/utils/cconv_test.ml
View file @
a8fb540b
...
@@ -13,8 +13,12 @@ let test_callee_saved () =
...
@@ -13,8 +13,12 @@ let test_callee_saved () =
let
project
=
Option
.
value_exn
!
example_project
in
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
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
()
=
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
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
()
=
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
()
=
let
test_parameter_register
()
=
...
@@ -22,8 +26,12 @@ let test_parameter_register () =
...
@@ -22,8 +26,12 @@ let test_parameter_register () =
let
project
=
Option
.
value_exn
!
example_project
in
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
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
()
=
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
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
()
=
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
()
=
let
test_return_register
()
=
...
@@ -35,6 +43,7 @@ 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
()
=
check
"no_return_register"
(
is_return_register
register
project
=
false
)
in
()
()
let
test_parse_dyn_syms
()
=
let
test_parse_dyn_syms
()
=
(* this test assumes, that the example project is the arrays_x64.out binary from the artificial samples. *)
(* 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
let
project
=
Option
.
value_exn
!
example_project
in
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment