Index: compiler-rt/trunk/lib/profile/InstrProfilingUtil.c =================================================================== --- compiler-rt/trunk/lib/profile/InstrProfilingUtil.c +++ compiler-rt/trunk/lib/profile/InstrProfilingUtil.c @@ -39,8 +39,25 @@ COMPILER_RT_VISIBILITY void __llvm_profile_recursive_mkdir(char *path) { int i; + int start = 1; - for (i = 1; path[i] != '\0'; ++i) { +#if defined(__ANDROID__) && defined(__ANDROID_API__) && \ + defined(__ANDROID_API_FUTURE__) && \ + __ANDROID_API__ == __ANDROID_API_FUTURE__ + // Avoid spammy selinux denial messages in Android by not attempting to + // create directories in GCOV_PREFIX. These denials occur when creating (or + // even attempting to stat()) top-level directories like "/data". + // + // Do so by ignoring ${GCOV_PREFIX} when invoking mkdir(). + const char *gcov_prefix = getenv("GCOV_PREFIX"); + if (gcov_prefix != NULL) { + const int gcov_prefix_len = strlen(gcov_prefix); + if (strncmp(path, gcov_prefix, gcov_prefix_len) == 0) + start = gcov_prefix_len; + } +#endif + + for (i = start; path[i] != '\0'; ++i) { char save = path[i]; if (!IS_DIR_SEPARATOR(path[i])) continue;