summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile26
-rw-r--r--main.cpp11
-rw-r--r--main.py10
-rw-r--r--readcov.py30
4 files changed, 77 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..5d843f5
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,26 @@
+all:cov.json coverage.json
+
+cov.json:default.profraw
+ llvm-profdata merge default.profraw -sparse -o merged.profdata
+ llvm-cov export -instr-profile merged.profdata ./exec . --format=text -Xdemangler c++filt -Xdemangler -n > cov.json
+
+coverage.json:.coverage
+ coverage json
+
+.coverage:main.py
+ coverage run main.py
+
+default.profraw:exec
+ ./exec
+
+exec:main.cpp
+ clang++ -o exec main.cpp -O3 -fprofile-instr-generate -fcoverage-mapping
+
+clean:
+ -rm exec
+ -rm default.profraw
+ -rm coverage.json
+ -rm cov.json
+ -rm .coverage
+
+.phony:all clean
diff --git a/main.cpp b/main.cpp
new file mode 100644
index 0000000..aef800e
--- /dev/null
+++ b/main.cpp
@@ -0,0 +1,11 @@
+#include <iostream>
+
+int f(int i) {
+ if (i <= 1) return 1;
+ return f(i - 1) + f(i - 2);
+}
+
+int main() {
+ std::cout << "hello world!" << std::endl;
+ return 0;
+}
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..895468a
--- /dev/null
+++ b/main.py
@@ -0,0 +1,10 @@
+def f(i: int) -> int:
+ if i < 2:
+ return 1
+ return f(i - 1) + f(i - 2)
+
+def main():
+ print("hello world!")
+
+if __name__ == '__main__':
+ main() \ No newline at end of file
diff --git a/readcov.py b/readcov.py
new file mode 100644
index 0000000..de490dc
--- /dev/null
+++ b/readcov.py
@@ -0,0 +1,30 @@
+import json
+
+def process_cpp_coverage(parsed: dict):
+ for data in cov["data"]:
+ for file in data["files"]:
+ print(file["filename"])
+ for seg in file["segments"]:
+ # https://github.com/llvm/llvm-project/blob/main/llvm/tools/llvm-cov/CoverageExporterJson.cpp
+ print("row, col, cnt, has_cnt, is_reg_entry, is_gap", seg)
+ return
+
+def process_py_coverage(parsed: dict):
+ for filename, vals in parsed["files"].items():
+ print(filename)
+ print(vals["missing_lines"])
+ return
+
+def json_dispatch(parsed: dict):
+ if "type" in parsed and parsed["type"] == "llvm.coverage.json.export":
+ process_cpp_coverage(parsed)
+ elif "meta" in parsed:
+ process_py_coverage(parsed)
+ return
+
+if __name__ == "__main__":
+ flist = ["cov.json", "coverage.json"]
+ for file in flist:
+ with open(file, "rt") as cov_json:
+ cov = json.load(cov_json)
+ json_dispatch(cov)