diff options
-rw-r--r-- | lib/profile/InstrProfiling.c | 5 | ||||
-rw-r--r-- | lib/profile/InstrProfilingFile.c | 9 | ||||
-rw-r--r-- | test/profile/instrprof-version-mismatch.c | 11 |
3 files changed, 23 insertions, 2 deletions
diff --git a/lib/profile/InstrProfiling.c b/lib/profile/InstrProfiling.c index 58778aeec..711f2b608 100644 --- a/lib/profile/InstrProfiling.c +++ b/lib/profile/InstrProfiling.c @@ -18,6 +18,8 @@ char *(*GetEnvHook)(const char *) = 0; +COMPILER_RT_WEAK uint64_t __llvm_profile_raw_version = INSTR_PROF_RAW_VERSION; + COMPILER_RT_VISIBILITY uint64_t __llvm_profile_get_magic(void) { return sizeof(void *) == sizeof(uint64_t) ? (INSTR_PROF_RAW_MAGIC_64) : (INSTR_PROF_RAW_MAGIC_32); @@ -32,7 +34,7 @@ __llvm_profile_get_num_padding_bytes(uint64_t SizeInBytes) { } COMPILER_RT_VISIBILITY uint64_t __llvm_profile_get_version(void) { - return INSTR_PROF_RAW_VERSION; + return __llvm_profile_raw_version; } COMPILER_RT_VISIBILITY void __llvm_profile_reset_counters(void) { @@ -65,4 +67,3 @@ COMPILER_RT_VISIBILITY void __llvm_profile_reset_counters(void) { } } } - diff --git a/lib/profile/InstrProfilingFile.c b/lib/profile/InstrProfilingFile.c index bf50c0276..98d85d9c1 100644 --- a/lib/profile/InstrProfilingFile.c +++ b/lib/profile/InstrProfilingFile.c @@ -214,6 +214,15 @@ int __llvm_profile_write_file(void) { return -1; } + /* Check if there is llvm/runtime versino mismatch. */ + if (GET_VERSION(__llvm_profile_get_version()) != INSTR_PROF_RAW_VERSION) { + PROF_ERR("LLVM Profile: runtime and instrumentation version mismatch : " + "expected %d, but get %d\n", + INSTR_PROF_RAW_VERSION, + (int)GET_VERSION(__llvm_profile_get_version())); + return -1; + } + /* Write the file. */ rc = writeFileWithName(__llvm_profile_CurrentFilename); if (rc) diff --git a/test/profile/instrprof-version-mismatch.c b/test/profile/instrprof-version-mismatch.c new file mode 100644 index 000000000..49ce41177 --- /dev/null +++ b/test/profile/instrprof-version-mismatch.c @@ -0,0 +1,11 @@ +// RUN: %clang_profgen -o %t -O3 %s +// RUN: LLVM_PROFILE_VERBOSE_ERRORS=1 %run %t 1 2>&1 | FileCheck %s + +// override the version variable with a bogus version: +unsigned long long __llvm_profile_raw_version = 10000; +int main(int argc, const char *argv[]) { + if (argc < 2) + return 1; + return 0; +} +// CHECK: LLVM Profile: runtime and instrumentation version mismatch |