From: Fangrui Song Date: Sun, 7 Jun 2020 06:11:31 +0000 (-0700) Subject: [gcov] Improve tests and lower the minimum supported version to gcov 3.4 X-Git-Tag: llvmorg-12-init~3855 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e664d0543f8ce5e1000593a6e881cdb7eb401c84;p=platform%2Fupstream%2Fllvm.git [gcov] Improve tests and lower the minimum supported version to gcov 3.4 global-ctor.ll no longer checks what it intended to check (@_GLOBAL__sub_I_global-ctor.ll needs a !dbg to work). Rewrite it. gcov 3.4 and gcov 4.2 use the same format, thus we can lower the version requirement to 3.4 --- diff --git a/clang/test/CodeGen/code-coverage.c b/clang/test/CodeGen/code-coverage.c index 3a11cb2..251e8bc 100644 --- a/clang/test/CodeGen/code-coverage.c +++ b/clang/test/CodeGen/code-coverage.c @@ -1,8 +1,9 @@ -/// We support coverage versions 4.2, 4.7 and 4.8. +/// We support coverage versions 3.4, 4.7 and 4.8. +/// 3.4 redesigns the format and changed .da to .gcda /// 4.7 enables cfg_checksum. /// 4.8 (default, compatible with gcov 7) emits the exit block the second. -// RUN: %clang_cc1 -emit-llvm -disable-red-zone -femit-coverage-data -coverage-version='402*' %s -o - | \ -// RUN: FileCheck --check-prefixes=CHECK,402 %s +// RUN: %clang_cc1 -emit-llvm -disable-red-zone -femit-coverage-data -coverage-version='304*' %s -o - | \ +// RUN: FileCheck --check-prefixes=CHECK,304 %s // RUN: %clang_cc1 -emit-llvm -disable-red-zone -femit-coverage-data -coverage-version='407*' %s -o - | \ // RUN: FileCheck --check-prefixes=CHECK,407 %s // RUN: %clang_cc1 -emit-llvm -disable-red-zone -femit-coverage-data %s -o - | \ @@ -40,8 +41,8 @@ int test2(int b) { // CHECK-SAME: [%0 zeroinitializer, %0 { i32 1, i32 0, i32 0 }] // CHECK: @__llvm_internal_gcov_emit_file_info = internal unnamed_addr constant [1 x %2] -/// 0x3430322a '4' '0' '2' '*' -// 402-SAME: i32 875573802 +/// 0x3330342a '3' '0' '4' '*' +// 304-SAME: i32 858797098 /// 0x3430372a '4' '0' '7' '*' // 407-SAME: i32 875575082 /// 0x3430382a '4' '0' '8' '*' diff --git a/compiler-rt/test/profile/gcov-basic.c b/compiler-rt/test/profile/gcov-basic.c new file mode 100644 index 0000000..f29dfd4 --- /dev/null +++ b/compiler-rt/test/profile/gcov-basic.c @@ -0,0 +1,20 @@ +// RUN: mkdir -p %t.dir && cd %t.dir + +/// gcov 3.4 redesigned the format and changed the extension from .da to .gcda +// RUN: %clang --coverage -Xclang -coverage-version='304*' %s -o %t +// RUN: rm -f gcov-basic.gcda && %run %t +// RUN: llvm-cov gcov -t gcov-basic.gcno | FileCheck %s + +/// r173147: split checksum into cfg checksum and line checksum. +// RUN: %clang --coverage -Xclang -coverage-version='407*' %s -o %t +// RUN: rm -f gcov-basic.gcda && %run %t +// RUN: llvm-cov gcov -t gcov-basic.gcno | FileCheck %s + +/// r189778: the exit block moved from the last to the second. +// RUN: %clang --coverage -Xclang -coverage-version='408*' %s -o %t +// RUN: rm -f gcov-basic.gcda && %run %t +// RUN: llvm-cov gcov -t gcov-basic.gcno + +int main() { // CHECK: 1: [[@LINE]]:int main + return 0; // CHECK-NEXT: 1: [[@LINE]]: +} diff --git a/llvm/include/llvm/ProfileData/GCOV.h b/llvm/include/llvm/ProfileData/GCOV.h index a212e0d7..91a345c 100644 --- a/llvm/include/llvm/ProfileData/GCOV.h +++ b/llvm/include/llvm/ProfileData/GCOV.h @@ -42,7 +42,7 @@ class FileInfo; namespace GCOV { -enum GCOVVersion { V402, V407, V408, V800, V900 }; +enum GCOVVersion { V304, V407, V408, V800, V900 }; /// A struct for passing gcov options between functions. struct Options { @@ -132,8 +132,8 @@ public: // r173147: split checksum into cfg checksum and line checksum. Version = GCOV::V407; return true; - } else { - Version = GCOV::V402; + } else if (Major == 4 || (Major == 3 && Minor >= 4)) { + Version = GCOV::V304; return true; } errs() << "unexpected version: " << str << "\n"; diff --git a/llvm/lib/ProfileData/GCOV.cpp b/llvm/lib/ProfileData/GCOV.cpp index 1379284..2e0d320 100644 --- a/llvm/lib/ProfileData/GCOV.cpp +++ b/llvm/lib/ProfileData/GCOV.cpp @@ -179,14 +179,13 @@ bool GCOVFile::readGCDA(GCOVBuffer &buf) { if (length == 0) // Placeholder continue; // As of GCC 10, GCOV_TAG_FUNCTION_LENGTH has never been larger than 3. - if (length != 3 || !buf.readInt(ident)) + if ((length != 2 && length != 3) || !buf.readInt(ident)) return false; auto It = IdentToFunction.find(ident); - uint32_t linenoChecksum, cfgChecksum; + uint32_t linenoChecksum, cfgChecksum = 0; buf.readInt(linenoChecksum); - buf.readInt(cfgChecksum); - if (Version < GCOV::V407) - cfgChecksum = 0; + if (Version >= GCOV::V407) + buf.readInt(cfgChecksum); if (It != IdentToFunction.end()) { fn = It->second; if (linenoChecksum != fn->linenoChecksum || diff --git a/llvm/test/Transforms/GCOVProfiling/global-ctor.ll b/llvm/test/Transforms/GCOVProfiling/global-ctor.ll index 7df4f6a..596a2ad 100644 --- a/llvm/test/Transforms/GCOVProfiling/global-ctor.ll +++ b/llvm/test/Transforms/GCOVProfiling/global-ctor.ll @@ -1,60 +1,43 @@ -; RUN: rm -rf %t && mkdir -p %t -; RUN: echo '!16 = !{!"%/t/global-ctor.ll", !0}' > %t/1 -; RUN: cat %s %t/1 > %t/2 -; RUN: opt -insert-gcov-profiling -disable-output < %t/2 -; RUN: not grep '_GLOBAL__sub_I_global-ctor' %t/global-ctor.gcno -; RUN: rm %t/global-ctor.gcno - -; RUN: opt -passes=insert-gcov-profiling -disable-output < %t/2 -; RUN: not grep '_GLOBAL__sub_I_global-ctor' %t/global-ctor.gcno -; RUN: rm %t/global-ctor.gcno - -@x = global i32 0, align 4 -@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_global-ctor.ll, i8* null }] - -; Function Attrs: nounwind -define internal void @__cxx_global_var_init() #0 section ".text.startup" !dbg !4 { +;; For a global constructor, _GLOBAL__sub_I_ only has artificial lines. +;; Test that we don't instrument those functions. +; RUN: opt -S -insert-gcov-profiling < %s | FileCheck %s +; RUN: opt -S -passes=insert-gcov-profiling < %s | FileCheck %s + +@var = dso_local global i32 0, align 4 +@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_a.cc, i8* null }] + +define internal void @__cxx_global_var_init() section ".text.startup" !dbg !7 { +; CHECK: define internal void @__cxx_global_var_init() +; CHECK: @__llvm_gcov_ctr +; CHECK: call i32 @_Z3foov() entry: - br label %0 - -;