1/*===- InstrProfilingUtil.h - Support library for PGO instrumentation -----===*\
2|*
3|* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4|* See https://llvm.org/LICENSE.txt for license information.
5|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6|*
7\*===----------------------------------------------------------------------===*/
8
9#ifndef PROFILE_INSTRPROFILINGUTIL_H
10#define PROFILE_INSTRPROFILINGUTIL_H
11
12#include <inttypes.h>
13#include <stddef.h>
14#include <stdio.h>
15
16/*! \brief Create a directory tree. */
17void __llvm_profile_recursive_mkdir(char *Pathname);
18
19/*! Set the mode used when creating profile directories. */
20void __llvm_profile_set_dir_mode(unsigned Mode);
21
22/*! Return the directory creation mode. */
23unsigned __llvm_profile_get_dir_mode(void);
24
25int lprofLockFd(int fd);
26int lprofUnlockFd(int fd);
27int lprofLockFileHandle(FILE *F);
28int lprofUnlockFileHandle(FILE *F);
29
30/*! Open file \c Filename for read+write with write
31 * lock for exclusive access. The caller will block
32 * if the lock is already held by another process. */
33FILE *lprofOpenFileEx(const char *Filename);
34/* PS4 doesn't have setenv/getenv/fork. Define a shim. */
35#if __ORBIS__
36#include <sys/types.h>
37static inline char *getenv(const char *name) { return NULL; }
38static inline int setenv(const char *name, const char *value, int overwrite)
39{ return 0; }
40static pid_t fork() { return -1; }
41#endif /* #if __ORBIS__ */
42
43/* GCOV_PREFIX and GCOV_PREFIX_STRIP support */
44/* Return the path prefix specified by GCOV_PREFIX environment variable.
45 * If GCOV_PREFIX_STRIP is also specified, the strip level (integer value)
46 * is returned via \c *PrefixStrip. The prefix length is stored in *PrefixLen.
47 */
48const char *lprofGetPathPrefix(int *PrefixStrip, size_t *PrefixLen);
49/* Apply the path prefix specified in \c Prefix to path string in \c PathStr,
50 * and store the result to buffer pointed to by \c Buffer. If \c PrefixStrip
51 * is not zero, path prefixes are stripped from \c PathStr (the level of
52 * stripping is specified by \c PrefixStrip) before \c Prefix is added.
53 */
54void lprofApplyPathPrefix(char *Dest, const char *PathStr, const char *Prefix,
55 size_t PrefixLen, int PrefixStrip);
56
57/* Returns a pointer to the first occurrence of \c DIR_SEPARATOR char in
58 * the string \c Path, or NULL if the char is not found. */
59const char *lprofFindFirstDirSeparator(const char *Path);
60/* Returns a pointer to the last occurrence of \c DIR_SEPARATOR char in
61 * the string \c Path, or NULL if the char is not found. */
62const char *lprofFindLastDirSeparator(const char *Path);
63
64int lprofGetHostName(char *Name, int Len);
65
66unsigned lprofBoolCmpXchg(void **Ptr, void *OldV, void *NewV);
67void *lprofPtrFetchAdd(void **Mem, long ByteIncr);
68
69/* Temporarily suspend SIGKILL. Return value of 1 means a restore is needed.
70 * Other return values mean no restore is needed.
71 */
72int lprofSuspendSigKill();
73
74/* Restore previously suspended SIGKILL. */
75void lprofRestoreSigKill();
76
77static inline size_t lprofRoundUpTo(size_t x, size_t boundary) {
78 return (x + boundary - 1) & ~(boundary - 1);
79}
80
81static inline size_t lprofRoundDownTo(size_t x, size_t boundary) {
82 return x & ~(boundary - 1);
83}
84
85int lprofReleaseMemoryPagesToOS(uintptr_t Begin, uintptr_t End);
86
87#endif /* PROFILE_INSTRPROFILINGUTIL_H */
88