@@ -258,8 +258,7 @@ let big_kernel_lock = AddrOf (Cil.var (Goblintutil.create_var (makeGlobalVar "[b
258258let console_sem = AddrOf (Cil. var (Goblintutil. create_var (makeGlobalVar " [console semaphore]" intType)))
259259
260260(* * Linux kernel functions. *)
261- (* TODO: conditional on kernel option *)
262- let linux_descs_list: (string * LibraryDesc. t) list = LibraryDsl. [
261+ let linux_kernel_descs_list: (string * LibraryDesc. t) list = LibraryDsl. [
263262 (" spin_lock_irqsave" , special [__ " lock" []; drop " flags" []] @@ fun lock -> Lock { lock; try_ = get_bool " sem.lock.fail" ; write = true ; return_on_success = true });
264263 (" spin_unlock_irqrestore" , special [__ " lock" []; drop " flags" []] @@ fun lock -> Unlock lock);
265264 (" _raw_spin_unlock_irqrestore" , special [__ " lock" []; drop " flags" []] @@ fun lock -> Unlock lock);
@@ -396,7 +395,6 @@ let verifier_atomic = AddrOf (Cil.var (Goblintutil.create_var verifier_atomic_va
396395
397396(* * SV-COMP functions.
398397 Just the ones that require special handling and cannot be stubbed. *)
399- (* TODO: conditional on ana.sv-comp.functions option *)
400398let svcomp_descs_list: (string * LibraryDesc. t) list = LibraryDsl. [
401399 (" __VERIFIER_atomic_begin" , special [] @@ Lock { lock = verifier_atomic; try_ = false ; write = true ; return_on_success = true });
402400 (" __VERIFIER_atomic_end" , special [] @@ Unlock verifier_atomic);
@@ -427,22 +425,29 @@ let ncurses_descs_list: (string * LibraryDesc.t) list = LibraryDsl.[
427425 (" wbkgd" , unknown [drop " win" [r_deep; w_deep]; drop " ch" []]);
428426 ]
429427
430- (* TODO: allow selecting which lists to use *)
431- let library_descs = Hashtbl. of_list (List. concat [
432- c_descs_list;
433- posix_descs_list;
434- pthread_descs_list;
435- gcc_descs_list;
436- glibc_desc_list;
437- linux_userspace_descs_list;
438- linux_descs_list;
439- goblint_descs_list;
440- zstd_descs_list;
441- math_descs_list;
442- svcomp_descs_list;
443- ncurses_descs_list;
444- ])
428+ let libraries = Hashtbl. of_list [
429+ (" c" , c_descs_list @ math_descs_list);
430+ (" posix" , posix_descs_list);
431+ (" pthread" , pthread_descs_list);
432+ (" gcc" , gcc_descs_list);
433+ (" glibc" , glibc_desc_list);
434+ (" linux-userspace" , linux_userspace_descs_list);
435+ (" linux-kernel" , linux_kernel_descs_list);
436+ (" goblint" , goblint_descs_list);
437+ (" sv-comp" , svcomp_descs_list);
438+ (" ncurses" , ncurses_descs_list);
439+ (" zstd" , zstd_descs_list);
440+ ]
445441
442+ let activated_library_descs: (string , LibraryDesc. t) Hashtbl. t ResettableLazy. t =
443+ ResettableLazy. from_fun (fun () ->
444+ let activated = List. unique (GobConfig. get_string_list " lib.activated" ) in
445+ let desc_list = List. concat_map (Hashtbl. find libraries) activated in
446+ Hashtbl. of_list desc_list
447+ )
448+
449+ let reset_lazy () =
450+ ResettableLazy. reset activated_library_descs
446451
447452type categories = [
448453 | `Malloc of exp
@@ -1149,7 +1154,7 @@ let unknown_desc ~f name = (* TODO: remove name argument, unknown function shoul
11491154
11501155let find f =
11511156 let name = f.vname in
1152- match Hashtbl. find_option library_descs name with
1157+ match Hashtbl. find_option ( ResettableLazy. force activated_library_descs) name with
11531158 | Some desc -> desc
11541159 | None ->
11551160 match get_invalidate_action name with
0 commit comments