Skip to content

Commit

Permalink
Fixes for builds that require strict X/Open and POSIX compatiblity
Browse files Browse the repository at this point in the history
Summary:
- Use alternative to MAP_ANONYMOUS for allocating mapped memory if it isn't available
- Use strtok_r instead of strsep as part of getting program path
- Don't try to find the width of a terminal using "struct winsize" and TIOCGWINSZ on POSIX builds. These aren't defined under POSIX (even though some platforms make them available when they shouldn't), so just check if we are doing a X/Open or POSIX compliant build first.

Author: daltenty

Reviewers: hubert.reinterpretcast, xingxue, andusy

Reviewed By: hubert.reinterpretcast

Subscribers: MaskRay, jsji, hiraditya, kristina, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D61326

llvm-svn: 360898
  • Loading branch information
xingxue-ibm committed May 16, 2019
1 parent 3966b02 commit 2dee094
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 11 deletions.
32 changes: 29 additions & 3 deletions llvm/lib/Support/Unix/Memory.inc
Expand Up @@ -91,9 +91,24 @@ Memory::allocateMappedMemory(size_t NumBytes,
if (NumBytes == 0)
return MemoryBlock();

int fd = -1;
// On platforms that have it, we can use MAP_ANON to get a memory-mapped
// page without file backing, but we need a fallback of opening /dev/zero
// for strictly POSIX platforms instead.
int fd;
#if defined(MAP_ANON)
fd = -1;
#else
fd = open("/dev/zero", O_RDWR);
if (fd == -1) {
EC = std::error_code(errno, std::generic_category());
return MemoryBlock();
}
#endif

int MMFlags = MAP_PRIVATE | MAP_ANON;
int MMFlags = MAP_PRIVATE;
#if defined(MAP_ANON)
MMFlags |= MAP_ANON;
#endif
int Protect = getPosixProtectionFlags(PFlags);

#if defined(__NetBSD__) && defined(PROT_MPROTECT)
Expand All @@ -111,13 +126,24 @@ Memory::allocateMappedMemory(size_t NumBytes,
void *Addr = ::mmap(reinterpret_cast<void *>(Start), NumBytes, Protect,
MMFlags, fd, 0);
if (Addr == MAP_FAILED) {
if (NearBlock) //Try again without a near hint
if (NearBlock) { //Try again without a near hint
#if !defined(MAP_ANON)
close(fd);
#endif
return allocateMappedMemory(NumBytes, nullptr, PFlags, EC);
}

EC = std::error_code(errno, std::generic_category());
#if !defined(MAP_ANON)
close(fd);
#endif
return MemoryBlock();
}

#if !defined(MAP_ANON)
close(fd);
#endif

MemoryBlock Result;
Result.Address = Addr;
Result.Size = NumBytes;
Expand Down
15 changes: 8 additions & 7 deletions llvm/lib/Support/Unix/Path.inc
Expand Up @@ -132,8 +132,6 @@ test_dir(char ret[PATH_MAX], const char *dir, const char *bin)
static char *
getprogpath(char ret[PATH_MAX], const char *bin)
{
char *pv, *s, *t;

/* First approach: absolute path. */
if (bin[0] == '/') {
if (test_dir(ret, "/", bin) == 0)
Expand All @@ -152,18 +150,21 @@ getprogpath(char ret[PATH_MAX], const char *bin)
}

/* Third approach: $PATH */
char *pv;
if ((pv = getenv("PATH")) == nullptr)
return nullptr;
s = pv = strdup(pv);
if (!pv)
char *s = strdup(pv);
if (!s)
return nullptr;
while ((t = strsep(&s, ":")) != nullptr) {
char *state;
for (char *t = strtok_r(s, ":", &state); t != nullptr;
t = strtok_r(nullptr, ":", &state)) {
if (test_dir(ret, t, bin) == 0) {
free(pv);
free(s);
return ret;
}
}
free(pv);
free(s);
return nullptr;
}
#endif // __FreeBSD__ || __NetBSD__ || __FreeBSD_kernel__
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/Support/Unix/Process.inc
Expand Up @@ -291,7 +291,8 @@ static unsigned getColumns(int FileID) {

unsigned Columns = 0;

#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TERMIOS_H)
#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TERMIOS_H) \
&& !(defined(_XOPEN_SOURCE) || defined(_POSIX_C_SOURCE))
// Try to determine the width of the terminal.
struct winsize ws;
if (ioctl(FileID, TIOCGWINSZ, &ws) == 0)
Expand Down

0 comments on commit 2dee094

Please sign in to comment.