Skip to content

Commit 99c6a9b

Browse files
committed
Add missing implementations
1 parent 6f36a65 commit 99c6a9b

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_aix.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,54 @@ const char *GetEnv(const char *name) { return getenv(name); }
342342

343343
tid_t GetTid() { return thread_self(); }
344344

345+
uptr ReadBinaryName(char *buf, uptr buf_len) {
346+
struct stat statData;
347+
struct psinfo psinfoData;
348+
349+
char FilePsinfo[100] = {};
350+
internal_snprintf(FilePsinfo, 100, "/proc/%d/psinfo", internal_getpid());
351+
CHECK_EQ(internal_stat(FilePsinfo, &statData), 0);
352+
353+
const int fd = internal_open(FilePsinfo, O_RDONLY);
354+
ssize_t readNum = internal_read(fd, &psinfoData, sizeof(psinfoData));
355+
CHECK_GE(readNum, 0);
356+
357+
internal_close(fd);
358+
char *binary_name = (reinterpret_cast<char ***>(psinfoData.pr_argv))[0][0];
359+
360+
// This is an absulate path.
361+
if (binary_name[0] == '/')
362+
return internal_snprintf(buf, buf_len, "%s", binary_name);
363+
364+
// This is a relative path to the binary, starts with ./ or ../
365+
if (binary_name[0] == '.') {
366+
char *path = nullptr;
367+
if ((path = internal_getcwd(buf, buf_len)) != nullptr)
368+
return internal_snprintf(buf + internal_strlen(path),
369+
buf_len - internal_strlen(path), "/%s",
370+
binary_name) +
371+
internal_strlen(path);
372+
}
373+
374+
// This is running a raw binary in the dir where it is from.
375+
char *path = nullptr;
376+
if ((path = internal_getcwd(buf, buf_len)) != nullptr) {
377+
char fullName[kMaxPathLength] = {};
378+
internal_snprintf(fullName, kMaxPathLength, "%s/%s", path, binary_name);
379+
if (FileExists(fullName))
380+
return internal_snprintf(buf + internal_strlen(path),
381+
buf_len - internal_strlen(path), "/%s",
382+
binary_name) +
383+
internal_strlen(path);
384+
}
385+
386+
// Find the binary in the env PATH.
387+
if ((path = FindPathToBinary(binary_name)) != nullptr)
388+
return internal_snprintf(buf, buf_len, "%s", path);
389+
390+
return 0;
391+
}
392+
345393
// https://www.ibm.com/docs/en/aix/7.3?topic=concepts-system-memory-allocation-using-malloc-subsystem
346394
uptr GetMaxVirtualAddress() {
347395
# if SANITIZER_WORDSIZE == 64
@@ -353,6 +401,10 @@ uptr GetMaxVirtualAddress() {
353401

354402
uptr GetMaxUserVirtualAddress() { return GetMaxVirtualAddress(); }
355403

404+
uptr ReadLongProcessName(/*out*/ char *buf, uptr buf_len) {
405+
return ReadBinaryName(buf, buf_len);
406+
}
407+
356408
void InitializePlatformCommonFlags(CommonFlags *cf) {}
357409

358410
void InitializePlatformEarly() {

0 commit comments

Comments
 (0)