@@ -114,18 +114,14 @@ let currentLocation = ref Cutil.no_loc
114
114
115
115
let updateLoc l = currentLocation := l
116
116
117
- let numErrors = ref 0
118
-
119
117
let error msg =
120
- incr numErrors;
121
- eprintf " %aError: %s\n " Cutil. printloc ! currentLocation msg
118
+ Cerrors. error " %aError: %s" Cutil. formatloc ! currentLocation msg
122
119
123
120
let unsupported msg =
124
- incr numErrors;
125
- eprintf " %aUnsupported feature: %s\n " Cutil. printloc ! currentLocation msg
121
+ Cerrors. error " %aUnsupported feature: %s" Cutil. formatloc ! currentLocation msg
126
122
127
123
let warning msg =
128
- eprintf " %aWarning: %s\n " Cutil. printloc ! currentLocation msg
124
+ Cerrors. warning " %aWarning: %s\n " Cutil. formatloc ! currentLocation msg
129
125
130
126
let string_of_errmsg msg =
131
127
let string_of_err = function
@@ -831,6 +827,30 @@ and convertExprList env el =
831
827
| [] -> Enil
832
828
| e1 :: el' -> Econs (convertExpr env e1, convertExprList env el')
833
829
830
+ (* Extended assembly *)
831
+
832
+ let convertAsm loc env txt outputs inputs clobber =
833
+ let (txt', output', inputs') =
834
+ ExtendedAsm. transf_asm loc env txt outputs inputs clobber in
835
+ let clobber' =
836
+ List. map intern_string clobber in
837
+ let ty_res =
838
+ match output' with None -> TVoid [] | Some e -> e.etyp in
839
+ (* Build the Ebuiltin expression *)
840
+ let e =
841
+ let tinputs = convertTypArgs env [] inputs' in
842
+ let toutput = convertTyp env ty_res in
843
+ Ebuiltin (EF_inline_asm (intern_string txt',
844
+ signature_of_type tinputs toutput cc_default,
845
+ clobber'),
846
+ tinputs,
847
+ convertExprList env inputs',
848
+ convertTyp env ty_res) in
849
+ (* Add an assignment to the output, if any *)
850
+ match output' with
851
+ | None -> e
852
+ | Some lhs -> Eassign (convertLvalue env lhs, e, typeof e)
853
+
834
854
(* Separate the cases of a switch statement body *)
835
855
836
856
type switchlabel =
@@ -891,7 +911,9 @@ let rec convertStmt ploc env s =
891
911
| C. Sdo e ->
892
912
add_lineno ploc s.sloc (swrap (Ctyping. sdo (convertExpr env e)))
893
913
| C. Sseq (s1 , s2 ) ->
894
- Ssequence (convertStmt ploc env s1, convertStmt s1.sloc env s2)
914
+ let s1' = convertStmt ploc env s1 in
915
+ let s2' = convertStmt s1.sloc env s2 in
916
+ Ssequence (s1', s2')
895
917
| C. Sif (e , s1 , s2 ) ->
896
918
let te = convertExpr env e in
897
919
add_lineno ploc s.sloc
@@ -940,11 +962,11 @@ let rec convertStmt ploc env s =
940
962
unsupported " nested blocks" ; Sskip
941
963
| C. Sdecl _ ->
942
964
unsupported " inner declarations" ; Sskip
943
- | C. Sasm txt ->
965
+ | C. Sasm ( attrs , txt , outputs , inputs , clobber ) ->
944
966
if not ! Clflags. option_finline_asm then
945
967
unsupported " inline 'asm' statement (consider adding option -finline-asm)" ;
946
968
add_lineno ploc s.sloc
947
- (Sdo (Ebuiltin ( EF_inline_asm (intern_string txt), Tnil , Enil , Tvoid ) ))
969
+ (Sdo (convertAsm s.sloc env txt outputs inputs clobber ))
948
970
949
971
and convertSwitch ploc env is_64 = function
950
972
| [] ->
@@ -1211,7 +1233,7 @@ let public_globals gl =
1211
1233
(* * Convert a [C.program] into a [Csyntax.program] *)
1212
1234
1213
1235
let convertProgram p =
1214
- numErrors := 0 ;
1236
+ Cerrors. reset () ;
1215
1237
stringNum := 0 ;
1216
1238
Hashtbl. clear decl_atom;
1217
1239
Hashtbl. clear stringTable;
@@ -1236,9 +1258,7 @@ let convertProgram p =
1236
1258
prog_main = intern_string " main" ;
1237
1259
prog_types = typs;
1238
1260
prog_comp_env = ce } in
1239
- if ! numErrors > 0
1240
- then None
1241
- else Some p'
1261
+ if Cerrors. check_errors () then None else Some p'
1242
1262
with Env. Error msg ->
1243
1263
error (Env. error_message msg); None
1244
1264
0 commit comments