123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182(**************************************************************************)(* *)(* SPDX-License-Identifier LGPL-2.1 *)(* Copyright (C) *)(* CEA (Commissariat à l'énergie atomique et aux énergies alternatives) *)(* *)(**************************************************************************)(** {1 API [ACSL_importer.paste_global_annot].} *)letpaste_global_annotpfileplinecfilesast=Paste.paste_global_annot~pfile~pline~cfilesastletpaste_global_annot=Dynamic.register~plugin:"ACSL_importer""paste_global_annot"(Datatype.func~label:("pfile",None)Datatype.string(Datatype.func~label:("pline",None)Datatype.int(Datatype.func~label:("cfile",None)Filepath.ty(Datatype.funcDatatype.string(Datatype.funcCil_datatype.File.tyDatatype.unit)))))paste_global_annotletpaste_global_annot?(pfile="ACSL-importer-buffer")?(pline=1)?(cfile=Filepath.empty)sast=paste_global_annotpfileplinecfilesast(** {1 API [ACSL_importer.paste_fun_spec].} *)letpaste_fun_speckfpfileplinecfilesast=Paste.paste_fun_speckf~pfile~pline~cfilesastletpaste_fun_spec=Dynamic.register~plugin:"ACSL_importer""paste_fun_spec"(Datatype.funcKernel_function.ty(Datatype.func~label:("pfile",None)Datatype.string(Datatype.func~label:("pline",None)Datatype.int(Datatype.func~label:("cfile",None)Filepath.ty(Datatype.funcDatatype.string(Datatype.funcCil_datatype.File.tyDatatype.unit))))))paste_fun_specletget_cfilekf=letglob=Kernel_function.get_globalkfinletfile=(fst(Cil_datatype.Global.locglob)).Filepath.pos_pathinfileletpaste_fun_speckf?(pfile="ACSL-importer-buffer")?(pline=1)?(cfile=(get_cfilekf))sast=paste_fun_speckfpfileplinecfilesast(** {1 API [ACSL_importer.paste_code_annot].} *)letpaste_code_annotkfstmtpfileplinecfilesast=Paste.paste_code_annotkfstmt~pfile~pline~cfilesastletpaste_code_annot=Dynamic.register~plugin:"ACSL_importer""paste_code_annot"(Datatype.funcKernel_function.ty(Datatype.funcCil_datatype.Stmt.ty(Datatype.func~label:("pfile",None)Datatype.string(Datatype.func~label:("pline",None)Datatype.int(Datatype.func~label:("cfile",None)Filepath.ty(Datatype.funcDatatype.string(Datatype.funcCil_datatype.File.tyDatatype.unit)))))))paste_code_annotletpaste_code_annotkfstmt?(pfile="ACSL-importer-buffer")?(pline=1)?(cfile=(get_cfilekf))sast=paste_code_annotkfstmtpfileplinecfilesast(** {1 API [ACSL_importer.import].} *)(** Import process. *)letimport~iDirastnbpfile=Import.import~iDir~pfile~init_typenames:(nb==0)ast;nb+1letimportiDirfilesast=ifnot(files=[])thenbeginletclose_importation()=Paste.SymbolIndex.clear_temporary_table();Logic_env.reset_typenames();(* importation may put additional dependencies between globals.
Just ask for a reordering at the end of the process.
*)File.reorder_custom_astast(* File.pretty_ast () *)in(* try *)letnb=List.fold_left(import~iDirast)0filesinclose_importation();(* with e ->
close_importation () ;
raise e *)Options.feedback"Done: %d file%s.@."nb(ifnb>1then"s"else"")endletimportfiles1files2ast=import(Options.Idirs.get())(files1@(Options.Import.get())@files2)ast;Options.set_importation_off()letimport=Dynamic.register~plugin:"ACSL_importer""import"(Datatype.func(Datatype.listDatatype.string)(Datatype.func(Datatype.listDatatype.string)(Datatype.funcCil_datatype.File.tyDatatype.unit)))import(** {1 API [ACSL_importer.import_from_cmdline].} *)(** Import from the cmdline process. *)letimport_from_cmdlineast=Options.feedback~level:2"Importing...";import[][]ast;Options.set_importation_off()letimport_from_cmdline=Dynamic.register~plugin:"ACSL_importer""import_from_cmdline"(Datatype.funcCil_datatype.File.tyDatatype.unit)import_from_cmdline(** {1 API [ACSL_importer.main].} *)letdkey=Options.register_category"trace-job"(** The main entry point. *)letmainast=Options.debug~level:2~dkey"Start ACSL_importer plugin...@.";ifOptions.is_importation_on()thenimport_from_cmdlineast;Options.debug~level:2~dkey"Stop ACSL_importer plugin...@."(** Register the function [main] as a main entry point. *)let()=letmain=Dynamic.register~plugin:"ACSL_importer""main"(Datatype.funcCil_datatype.File.tyDatatype.unit)maininFile.add_code_transformation_after_cleanup~deps:[(moduleOptions.Import:Parameter_sig.S);(moduleOptions.Run:Parameter_sig.S)]~before:[Unfold_loops.transform]Options.main_importmain