diff --git a/src/kernel_services/ast_queries/json_compilation_database.ml b/src/kernel_services/ast_queries/json_compilation_database.ml index 11c2802451cd21e4e895e0d32639d3a8ce2e1a34..01fbfdb999ca29ca080642fd61b578cd3e33fa2a 100644 --- a/src/kernel_services/ast_queries/json_compilation_database.ml +++ b/src/kernel_services/ast_queries/json_compilation_database.ml @@ -211,6 +211,16 @@ let update_flags_verbosely path flags = | Not_found -> Flags.add path flags +let parse_build_entry bcdb_dir r = + let open Yojson.Basic.Util in + let filenames = r |> member "sources" |> to_list |> List.map to_string in + let args = List.map to_string (r |> member "arguments" |> to_list) in + let flags = filter_useful_flags ~requote:true args in + List.iter (fun filename -> + let path = Datatype.Filepath.of_string ~base_name:bcdb_dir filename in + update_flags_verbosely path flags + ) filenames + let parse_compilation_entry jcdb_dir r = let open Yojson.Basic.Util in let filename = r |> member "file" |> to_string in @@ -259,7 +269,15 @@ let compute_flags_from_file () = let r_list = Yojson.Basic.from_file jcdb_path |> Yojson.Basic.Util.to_list in - List.iter (parse_compilation_entry jcdb_dir) r_list; + let is_build_database = + try + List.hd r_list |> Yojson.Basic.Util.member "sources" <> `Null + with _ -> false + in + let parse_entry = + if is_build_database then parse_build_entry else parse_compilation_entry + in + List.iter (parse_entry jcdb_dir) r_list; with | Sys_error msg | Yojson.Json_error msg diff --git a/tests/jcdb/build_commands.json b/tests/jcdb/build_commands.json new file mode 100644 index 0000000000000000000000000000000000000000..f12bcb79f6035b3b33973efcc2271725ab1e6778 --- /dev/null +++ b/tests/jcdb/build_commands.json @@ -0,0 +1,20 @@ +[ + { + "command": "/usr/bin/gcc -c jbdb.c jbdb2.c -DRETCODE=0", + "arguments": [ + "/usr/bin/gcc", + "-c", + "jbdb.c", + "jbdb2.c", + "-DRETCODE=0" + ], + "sources": [ + "jbdb.c", + "jbdb2.c" + ], + "targets": [ + "jbdb.o", + "jbdb2.o" + ] + } +] diff --git a/tests/jcdb/jbdb.c b/tests/jcdb/jbdb.c new file mode 100644 index 0000000000000000000000000000000000000000..d73218424429882a7b66ede7d3b67bb6c920f0d3 --- /dev/null +++ b/tests/jcdb/jbdb.c @@ -0,0 +1,7 @@ +/* run.config +OPT: -json-compilation-database @PTEST_DIR@/build_commands.json -print +*/ + +int f2 () { + return RETCODE; // defined in build_commands.json +} diff --git a/tests/jcdb/jbdb2.c b/tests/jcdb/jbdb2.c new file mode 100644 index 0000000000000000000000000000000000000000..db89a97f607bda7804244e621acd67adbf107bd1 --- /dev/null +++ b/tests/jcdb/jbdb2.c @@ -0,0 +1,7 @@ +/* run.config +OPT: -json-compilation-database @PTEST_DIR@/build_commands.json -print +*/ + +int f1 () { + return RETCODE; // defined in build_commands.json +} diff --git a/tests/jcdb/oracle/jbdb.res.oracle b/tests/jcdb/oracle/jbdb.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..592d8314fdbf4108ad558ff912fd7ca8d5e600d1 --- /dev/null +++ b/tests/jcdb/oracle/jbdb.res.oracle @@ -0,0 +1,10 @@ +[kernel] Parsing tests/jcdb/jbdb.c (with preprocessing) +/* Generated by Frama-C */ +int f2(void) +{ + int __retres; + __retres = 0; + return __retres; +} + + diff --git a/tests/jcdb/oracle/jbdb2.res.oracle b/tests/jcdb/oracle/jbdb2.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..376850836aa1aaf9fb60d6e7f3ff8729666477b7 --- /dev/null +++ b/tests/jcdb/oracle/jbdb2.res.oracle @@ -0,0 +1,10 @@ +[kernel] Parsing tests/jcdb/jbdb2.c (with preprocessing) +/* Generated by Frama-C */ +int f1(void) +{ + int __retres; + __retres = 0; + return __retres; +} + +