@@ -57,7 +57,7 @@ let pp_return fmt n =
57
57
58
58
let pp_sao fmt sao =
59
59
let open Stack_alloc in
60
- Format. fprintf fmt " alignment = %s; size = %a; ioff = %a; extra size = %a; max size = %a@;max call depth = %a@;params =@;<2 2>@[<v>%a@]@;return = @[<hov>%a@]@;slots =@;<2 2>@[<v>%a@]@;alloc= @;<2 2>@[<v>%a@]@;saved register = @[<hov>%a@]@;saved stack = %a@;return address = %a"
60
+ Format. fprintf fmt " alignment = %s; size = %a; ioff = %a; extra size = %a; max size = %a@;max call depth = %a@;params =@;<2 2>@[<v>%a@]@;return = @[<hov>%a@]@;slots =@;<2 2>@[<v>%a@]@;alloc = @;<2 2>@[<v>%a@]@;saved register = @[<hov>%a@]@;saved stack = %a@;return address = %a"
61
61
(string_of_ws sao.sao_align)
62
62
Z. pp_print (Conv. z_of_cz sao.sao_size)
63
63
Z. pp_print (Conv. z_of_cz sao.sao_ioff)
@@ -88,6 +88,127 @@ let pp_oracle up fmt saos =
88
88
(pp_list " @;" pp_slot) ao_global_alloc
89
89
(pp_list " @;" pp_stack_alloc) fs
90
90
91
+ let json_of_param_info pi =
92
+ let open Stack_alloc in
93
+ match pi with
94
+ | None -> `Null
95
+ | Some pi ->
96
+ `Assoc [
97
+ " writable" , `Bool pi.pp_writable;
98
+ " var" , `String (Format. asprintf " %a" pp_var_ty (Conv. var_of_cvar pi.pp_ptr));
99
+ " alignment" , `String (string_of_ws pi.pp_align)
100
+ ]
101
+
102
+ let json_of_return n =
103
+ match n with
104
+ | None -> `Null
105
+ | Some n -> `Int (Conv. int_of_nat n)
106
+
107
+ let json_of_slot ((x , ws ), ofs ) =
108
+ `Assoc [
109
+ " offset" , `Int (Z. to_int (Conv. z_of_cz ofs));
110
+ " var" , `String (Format. asprintf " %a" pp_var_ty (Conv. var_of_cvar x));
111
+ " alignment" , `String (string_of_ws ws);
112
+ ]
113
+
114
+ let json_of_alloc (x , pki ) =
115
+ let json_of_pki pki =
116
+ let open Stack_alloc in
117
+ match pki with
118
+ | PIdirect (v , z , sc ) ->
119
+ " direct" ,
120
+ `Assoc [
121
+ " scope" , `String (if sc = Sglob then " global" else " stack" );
122
+ " var" , `String (Format. asprintf " %a" pp_var (Conv. var_of_cvar v));
123
+ " zone" , `String (Format. asprintf " %a" pp_zone z);
124
+ ]
125
+ | PIregptr v ->
126
+ " reg ptr" ,
127
+ `Assoc [
128
+ " var" , `String (Format. asprintf " %a" pp_var (Conv. var_of_cvar v))
129
+ ]
130
+ | PIstkptr (v , z , x ) ->
131
+ " stack ptr" ,
132
+ `Assoc [
133
+ " var" , `String (Format. asprintf " %a" pp_var_ty (Conv. var_of_cvar v));
134
+ " zone" , `String (Format. asprintf " %a" pp_zone z);
135
+ " pseudo-reg" , `String (Format. asprintf " %a" pp_var_ty (Conv. var_of_cvar x))
136
+ ]
137
+ in
138
+ `Assoc [
139
+ " var" , `String (Format. asprintf " %a" pp_var (Conv. var_of_cvar x));
140
+ json_of_pki pki
141
+ ]
142
+
143
+ let json_of_to_save (x , ofs ) =
144
+ `Assoc [
145
+ " var" , `String (Format. asprintf " %a" pp_var (Conv. var_of_cvar x));
146
+ " offset" , `Int (Z. to_int (Conv. z_of_cz ofs));
147
+ ]
148
+
149
+ let json_of_saved_stack ss =
150
+ let open Expr in
151
+ match ss with
152
+ | SavedStackNone -> `Null
153
+ | SavedStackReg x ->
154
+ `Assoc [" reg" , `String (Format. asprintf " %a" pp_var (Conv. var_of_cvar x))]
155
+ | SavedStackStk z ->
156
+ `Assoc [" stack" , `Int (Z. to_int (Conv. z_of_cz z))]
157
+
158
+ let json_of_return_address ra =
159
+ let open Expr in
160
+ match ra with
161
+ | RAnone -> `Null
162
+ | RAreg x ->
163
+ `Assoc [" reg" , `String (Format. asprintf " %a" pp_var (Conv. var_of_cvar x))]
164
+ | RAstack (x , z ) ->
165
+ `Assoc [" stack" ,
166
+ `Assoc [
167
+ " var" ,
168
+ begin match x with
169
+ | None -> `Null
170
+ | Some x -> `String (Format. asprintf " %a" pp_var (Conv. var_of_cvar x))
171
+ end ;
172
+ " offset" , `Int (Z. to_int (Conv. z_of_cz z))
173
+ ]
174
+ ]
175
+
176
+ let json_of_sao fn sao : Yojson.Basic.t =
177
+ let open Stack_alloc in
178
+ `Assoc [
179
+ " function name" , `String fn.fn_name;
180
+ " alignment" , `String (string_of_ws sao.sao_align);
181
+ " size" , `Int (Z. to_int (Conv. z_of_cz sao.sao_size));
182
+ " ioff" , `Int (Z. to_int (Conv. z_of_cz sao.sao_ioff));
183
+ " extra size" , `Int (Z. to_int (Conv. z_of_cz sao.sao_extra_size));
184
+ " max size" , `Int (Z. to_int (Conv. z_of_cz sao.sao_max_size));
185
+ " max call depth" , `Int (Z. to_int (Conv. z_of_cz sao.sao_max_call_depth));
186
+ " params" , `List (List. map json_of_param_info sao.sao_params);
187
+ " return" , `List (List. map json_of_return sao.sao_return);
188
+ " slots" , `List (List. map json_of_slot sao.sao_slots);
189
+ " alloc" , `List (List. map json_of_alloc sao.sao_alloc);
190
+ " saved register" , `List (List. map json_of_to_save sao.sao_to_save);
191
+ " saved stack" , json_of_saved_stack sao.sao_rsp;
192
+ " return address" , json_of_return_address sao.sao_return_address;
193
+ ]
194
+
195
+ let json_of_oracle up saos =
196
+ let Compiler. { ao_globals; ao_global_alloc; ao_stack_alloc } = saos in
197
+ let json_of_globals global =
198
+ `Int (Z. to_int (Conv. z_of_word U8 global))
199
+ in
200
+ let json_of_stack_alloc f =
201
+ let fn = f.f_name in
202
+ json_of_sao fn (ao_stack_alloc fn)
203
+ in
204
+ let _, fs = Conv. prog_of_cuprog up in
205
+ `Assoc [
206
+ (" global data" , `List (List. map json_of_globals ao_globals));
207
+ (" global slots" , `List (List. map json_of_slot ao_global_alloc));
208
+ (" stack alloc" , `List (List. map json_of_stack_alloc fs));
209
+ ]
210
+
211
+
91
212
module StackAlloc (Arch : Arch_full.Arch ) = struct
92
213
93
214
module Regalloc = Regalloc (Arch )
@@ -316,6 +437,12 @@ let memory_analysis pp_err ~debug up =
316
437
Format. eprintf " (* Final results of the stack allocation oracle *)@.@." ;
317
438
Format. eprintf " %a@.@.@." (pp_oracle up) saos
318
439
end ;
440
+ let outfile = ! Glob_options. json_stack_alloc_file in
441
+ if outfile <> " " then begin
442
+ BatFile. with_file_out outfile (fun out ->
443
+ let fmt = BatFormat. formatter_of_out_channel out in
444
+ Format. fprintf fmt " %a@." Yojson.Basic. pretty_print (json_of_oracle up saos));
445
+ end ;
319
446
320
447
saos
321
448
0 commit comments