[compiler-rt] r256848 - [PGO] Enable building compiler-rt profile support library on Windows

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 5 16:19:00 PST 2016


Nathan Slingerland via llvm-commits <llvm-commits at lists.llvm.org>
writes:
> Author: slingn
> Date: Tue Jan  5 11:27:01 2016
> New Revision: 256848
>
> URL: http://llvm.org/viewvc/llvm-project?rev=256848&view=rev
> Log:
> [PGO] Enable building compiler-rt profile support library on Windows
>
> Summary: This change configures Windows builds to build the
> complier-rt profile support library
> (clang_rt.profile-i386.lib). Windows API incompatibilities in the
> compiler-rt profile lib are also fixed.

My (-Werror) builds fail after this commit:

    .../llvm/projects/compiler-rt/lib/profile/WindowsMMap.c:128:20: error: ISO C requires a translation unit to contain at least one declaration [-Werror,-Wempty-translation-unit]
    #endif /* _WIN32 */
                       ^
    1 error generated.

> Reviewers: davidxl, dnovillo
>
> Subscribers: llvm-commits
>
> Differential Revision: http://reviews.llvm.org/D15830
>
> Added:
>     compiler-rt/trunk/lib/profile/WindowsMMap.c
>     compiler-rt/trunk/lib/profile/WindowsMMap.h
> Modified:
>     compiler-rt/trunk/cmake/config-ix.cmake
>     compiler-rt/trunk/lib/profile/CMakeLists.txt
>     compiler-rt/trunk/lib/profile/GCDAProfiling.c
>     compiler-rt/trunk/lib/profile/InstrProfilingFile.c
>
> Modified: compiler-rt/trunk/cmake/config-ix.cmake
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/cmake/config-ix.cmake?rev=256848&r1=256847&r2=256848&view=diff
> ==============================================================================
> --- compiler-rt/trunk/cmake/config-ix.cmake (original)
> +++ compiler-rt/trunk/cmake/config-ix.cmake Tue Jan  5 11:27:01 2016
> @@ -559,7 +559,7 @@ else()
>  endif()
>  
>  if (PROFILE_SUPPORTED_ARCH AND
> -    OS_NAME MATCHES "Darwin|Linux|FreeBSD")
> +    OS_NAME MATCHES "Darwin|Linux|FreeBSD|Windows")
>    set(COMPILER_RT_HAS_PROFILE TRUE)
>  else()
>    set(COMPILER_RT_HAS_PROFILE FALSE)
>
> Modified: compiler-rt/trunk/lib/profile/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/CMakeLists.txt?rev=256848&r1=256847&r2=256848&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/profile/CMakeLists.txt (original)
> +++ compiler-rt/trunk/lib/profile/CMakeLists.txt Tue Jan  5 11:27:01 2016
> @@ -35,7 +35,8 @@ set(PROFILE_SOURCES
>    InstrProfilingPlatformLinux.c
>    InstrProfilingPlatformOther.c
>    InstrProfilingRuntime.cc
> -  InstrProfilingUtil.c)
> +  InstrProfilingUtil.c
> +  WindowsMMap.c)
>  
>  if(UNIX)
>   set(EXTRA_FLAGS
>
> Modified: compiler-rt/trunk/lib/profile/GCDAProfiling.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/GCDAProfiling.c?rev=256848&r1=256847&r2=256848&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/profile/GCDAProfiling.c (original)
> +++ compiler-rt/trunk/lib/profile/GCDAProfiling.c Tue Jan  5 11:27:01 2016
> @@ -27,8 +27,13 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <string.h>
> +
> +#if defined(_WIN32)
> +#include "WindowsMMap.h"
> +#else
>  #include <sys/mman.h>
>  #include <sys/file.h>
> +#endif
>  
>  #define I386_FREEBSD (defined(__FreeBSD__) && defined(__i386__))
>  
> @@ -37,6 +42,7 @@
>  #endif
>  
>  #if defined(_MSC_VER)
> +typedef unsigned char uint8_t;
>  typedef unsigned int uint32_t;
>  typedef unsigned long long uint64_t;
>  #elif I386_FREEBSD
>
> Modified: compiler-rt/trunk/lib/profile/InstrProfilingFile.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingFile.c?rev=256848&r1=256847&r2=256848&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/profile/InstrProfilingFile.c (original)
> +++ compiler-rt/trunk/lib/profile/InstrProfilingFile.c Tue Jan  5 11:27:01 2016
> @@ -17,6 +17,10 @@
>  
>  #define UNCONST(ptr) ((void *)(uintptr_t)(ptr))
>  
> +#ifdef _MSC_VER
> +#define snprintf _snprintf
> +#endif
> +
>  /* Return 1 if there is an error, otherwise return  0.  */
>  static uint32_t fileWriter(ProfDataIOVec *IOVecs, uint32_t NumIOVecs,
>                             void **WriterCtx) {
>
> Added: compiler-rt/trunk/lib/profile/WindowsMMap.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/WindowsMMap.c?rev=256848&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/profile/WindowsMMap.c (added)
> +++ compiler-rt/trunk/lib/profile/WindowsMMap.c Tue Jan  5 11:27:01 2016
> @@ -0,0 +1,128 @@
> +/*
> + * This code is derived from uClibc (original license follows).
> + * https://git.uclibc.org/uClibc/tree/utils/mmap-windows.c
> + */
> + /* mmap() replacement for Windows
> + *
> + * Author: Mike Frysinger <vapier at gentoo.org>
> + * Placed into the public domain
> + */
> +
> +/* References:
> + * CreateFileMapping: http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx
> + * CloseHandle:       http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx
> + * MapViewOfFile:     http://msdn.microsoft.com/en-us/library/aa366761(VS.85).aspx
> + * UnmapViewOfFile:   http://msdn.microsoft.com/en-us/library/aa366882(VS.85).aspx
> + */
> +
> +#if defined(_WIN32)
> +
> +#include "WindowsMMap.h"
> +#include "InstrProfiling.h"
> +
> +#ifdef __USE_FILE_OFFSET64
> +# define DWORD_HI(x) (x >> 32)
> +# define DWORD_LO(x) ((x) & 0xffffffff)
> +#else
> +# define DWORD_HI(x) (0)
> +# define DWORD_LO(x) (x)
> +#endif
> +
> +COMPILER_RT_VISIBILITY
> +void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
> +{
> +  if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC))
> +    return MAP_FAILED;
> +  if (fd == -1) {
> +    if (!(flags & MAP_ANON) || offset)
> +      return MAP_FAILED;
> +  } else if (flags & MAP_ANON)
> +    return MAP_FAILED;
> +
> +  DWORD flProtect;
> +  if (prot & PROT_WRITE) {
> +    if (prot & PROT_EXEC)
> +      flProtect = PAGE_EXECUTE_READWRITE;
> +    else
> +      flProtect = PAGE_READWRITE;
> +  } else if (prot & PROT_EXEC) {
> +    if (prot & PROT_READ)
> +      flProtect = PAGE_EXECUTE_READ;
> +    else if (prot & PROT_EXEC)
> +      flProtect = PAGE_EXECUTE;
> +  } else
> +    flProtect = PAGE_READONLY;
> +
> +  off_t end = length + offset;
> +  HANDLE mmap_fd, h;
> +  if (fd == -1)
> +    mmap_fd = INVALID_HANDLE_VALUE;
> +  else
> +    mmap_fd = (HANDLE)_get_osfhandle(fd);
> +  h = CreateFileMapping(mmap_fd, NULL, flProtect, DWORD_HI(end), DWORD_LO(end), NULL);
> +  if (h == NULL)
> +    return MAP_FAILED;
> +
> +  DWORD dwDesiredAccess;
> +  if (prot & PROT_WRITE)
> +    dwDesiredAccess = FILE_MAP_WRITE;
> +  else
> +    dwDesiredAccess = FILE_MAP_READ;
> +  if (prot & PROT_EXEC)
> +    dwDesiredAccess |= FILE_MAP_EXECUTE;
> +  if (flags & MAP_PRIVATE)
> +    dwDesiredAccess |= FILE_MAP_COPY;
> +  void *ret = MapViewOfFile(h, dwDesiredAccess, DWORD_HI(offset), DWORD_LO(offset), length);
> +  if (ret == NULL) {
> +    CloseHandle(h);
> +    ret = MAP_FAILED;
> +  }
> +  return ret;
> +}
> +
> +COMPILER_RT_VISIBILITY
> +void munmap(void *addr, size_t length)
> +{
> +  UnmapViewOfFile(addr);
> +  /* ruh-ro, we leaked handle from CreateFileMapping() ... */
> +}
> +
> +COMPILER_RT_VISIBILITY
> +int msync(void *addr, size_t length, int flags)
> +{
> +  if (flags & MS_INVALIDATE)
> +    return -1; /* Not supported. */
> +
> +  /* Exactly one of MS_ASYNC or MS_SYNC must be specified. */
> +  switch (flags & (MS_ASYNC | MS_SYNC)) {
> +    case MS_SYNC:
> +    case MS_ASYNC:
> +      break;
> +    default:
> +      return -1;
> +  }
> +
> +  if (!FlushViewOfFile(addr, length))
> +    return -1;
> +
> +  if (flags & MS_SYNC) {
> +    /* FIXME: No longer have access to handle from CreateFileMapping(). */
> +    /*
> +     * if (!FlushFileBuffers(h))
> +     *   return -1;
> +     */
> +  }
> +
> +  return 0;
> +}
> +
> +COMPILER_RT_VISIBILITY
> +int flock(int fd, int operation)
> +{
> +  return -1; /* Not supported. */
> +}
> +
> +#undef DWORD_HI
> +#undef DWORD_LO
> +
> +#endif /* _WIN32 */
>
> Added: compiler-rt/trunk/lib/profile/WindowsMMap.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/WindowsMMap.h?rev=256848&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/profile/WindowsMMap.h (added)
> +++ compiler-rt/trunk/lib/profile/WindowsMMap.h Tue Jan  5 11:27:01 2016
> @@ -0,0 +1,65 @@
> +/*===- WindowsMMap.h - Support library for PGO instrumentation ------------===*\
> +|*
> +|*                     The LLVM Compiler Infrastructure
> +|*
> +|* This file is distributed under the University of Illinois Open Source
> +|* License. See LICENSE.TXT for details.
> +|*
> +\*===----------------------------------------------------------------------===*/
> +
> +#ifndef PROFILE_INSTRPROFILING_WINDOWS_MMAP_H
> +#define PROFILE_INSTRPROFILING_WINDOWS_MMAP_H
> +
> +#if defined(_WIN32)
> +
> +#include <BaseTsd.h>
> +#include <io.h>
> +#include <sys/types.h>
> +
> +/*
> + * mmap() flags
> + */
> +#define PROT_READ     0x1
> +#define PROT_WRITE    0x2
> +/* This flag is only available in WinXP+ */
> +#ifdef FILE_MAP_EXECUTE
> +#define PROT_EXEC     0x4
> +#else
> +#define PROT_EXEC        0x0
> +#define FILE_MAP_EXECUTE 0
> +#endif
> +
> +#define MAP_FILE      0x00
> +#define MAP_SHARED    0x01
> +#define MAP_PRIVATE   0x02
> +#define MAP_ANONYMOUS 0x20
> +#define MAP_ANON      MAP_ANONYMOUS
> +#define MAP_FAILED    ((void *) -1)
> +
> +/*
> + * msync() flags
> + */
> +#define MS_ASYNC        0x0001  /* return immediately */
> +#define MS_INVALIDATE   0x0002  /* invalidate all cached data */
> +#define MS_SYNC         0x0010  /* msync synchronously */
> +
> +/*
> + * flock() operations
> + */
> +#define   LOCK_SH   1    /* shared lock */
> +#define   LOCK_EX   2    /* exclusive lock */
> +#define   LOCK_NB   4    /* don't block when locking */
> +#define   LOCK_UN   8    /* unlock */
> +
> +void *mmap(void *start, size_t length, int prot, int flags, int fd,
> +           off_t offset);
> +
> +void munmap(void *addr, size_t length);
> +
> +int msync(void *addr, size_t length, int flags);
> +
> +int flock(int fd, int operation);
> +
> +#endif /* _WIN32 */
> +
> +#endif /* PROFILE_INSTRPROFILING_WINDOWS_MMAP_H */
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list