[Openmp-commits] [clang] [compiler-rt] [llvm] [openmp] [PGO][Offload] Profile profraw generation for GPU instrumentation #76587 (PR #93365)
Johannes Doerfert via Openmp-commits
openmp-commits at lists.llvm.org
Tue Feb 11 13:55:23 PST 2025
================
@@ -1359,4 +1362,107 @@ COMPILER_RT_VISIBILITY int __llvm_profile_set_file_object(FILE *File,
return 0;
}
+int __llvm_write_custom_profile(const char *Target,
+ const __llvm_profile_data *DataBegin,
+ const __llvm_profile_data *DataEnd,
+ const char *CountersBegin,
+ const char *CountersEnd, const char *NamesBegin,
+ const char *NamesEnd) {
+ int ReturnValue = 0, FilenameLength, TargetLength;
+ char *FilenameBuf, *TargetFilename;
+ const char *Filename;
+
+ /* Save old profile data */
+ FILE *oldFile = getProfileFile();
+
+ // Temporarily suspend getting SIGKILL when the parent exits.
+ int PDeathSig = lprofSuspendSigKill();
+
+ if (lprofProfileDumped() || __llvm_profile_is_continuous_mode_enabled()) {
+ PROF_NOTE("Profile data not written to file: %s.\n", "already written");
+ if (PDeathSig == 1)
+ lprofRestoreSigKill();
+ return 0;
+ }
+
+ /* Get current filename */
+ FilenameLength = getCurFilenameLength();
+ FilenameBuf = (char *)COMPILER_RT_ALLOCA(FilenameLength + 1);
+ Filename = getCurFilename(FilenameBuf, 0);
+
+ /* Check the filename. */
+ if (!Filename) {
+ PROF_ERR("Failed to write file : %s\n", "Filename not set");
+ if (PDeathSig == 1)
+ lprofRestoreSigKill();
+ return -1;
+ }
+
+ /* Allocate new space for our target-specific PGO filename */
+ TargetLength = strlen(Target);
+ TargetFilename =
+ (char *)COMPILER_RT_ALLOCA(FilenameLength + TargetLength + 2);
+
+ /* Find file basename and path sizes */
+ int32_t DirEnd = FilenameLength - 1;
+ while (DirEnd >= 0 && !IS_DIR_SEPARATOR(Filename[DirEnd])) {
+ DirEnd--;
+ }
+ uint32_t DirSize = DirEnd + 1, BaseSize = FilenameLength - DirSize;
+
+ /* Prepend "TARGET." to current filename */
+ if (DirSize > 0) {
+ memcpy(TargetFilename, Filename, DirSize);
+ }
+ memcpy(TargetFilename + DirSize, Target, TargetLength);
+ TargetFilename[TargetLength + DirSize] = '.';
+ memcpy(TargetFilename + DirSize + 1 + TargetLength, Filename + DirSize,
+ BaseSize);
+ TargetFilename[FilenameLength + 1 + TargetLength] = 0;
+
+ /* Check if there is llvm/runtime version mismatch. */
+ if (GET_VERSION(__llvm_profile_get_version()) != INSTR_PROF_RAW_VERSION) {
+ PROF_ERR("Runtime and instrumentation version mismatch : "
+ "expected %d, but get %d\n",
+ INSTR_PROF_RAW_VERSION,
+ (int)GET_VERSION(__llvm_profile_get_version()));
+ if (PDeathSig == 1)
+ lprofRestoreSigKill();
+ return -1;
+ }
----------------
jdoerfert wrote:
Move this up to the beginning.
https://github.com/llvm/llvm-project/pull/93365
More information about the Openmp-commits
mailing list