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

Xinliang David Li via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 5 19:11:36 PST 2016


this patch is ok.

What I suggested is to

#include "InstrProfiling.h"
#ifdef _WIN32
....

#endif

which introduces some decls

On Tue, Jan 5, 2016 at 7:06 PM, Nathan Slingerland <slingn at gmail.com> wrote:

> Hi David,
>
> Sorry - I don't understand how that would fix it. Currently the
> compiler-rt/lib/profile/CMakeLists.txt has:
>
> set(PROFILE_SOURCES
>   GCDAProfiling.c
>   InstrProfiling.c
>   InstrProfilingValue.c
>   InstrProfilingBuffer.c
>   InstrProfilingFile.c
>   InstrProfilingWriter.c
>   InstrProfilingPlatformDarwin.c
>   InstrProfilingPlatformLinux.c
>   InstrProfilingPlatformOther.c
>   InstrProfilingRuntime.cc
>   InstrProfilingUtil.c
>   WindowsMMap.c)
>
> Isn't the issue that WindowsMMap.c is effectively empty on non-Windows platforms because of the #ifdef _WIN32 around the contents of the WindowsMMap.c file?
>
> I was able to verify that changing to the below fixes the issue:
>
> set(PROFILE_SOURCES
>   GCDAProfiling.c
>   InstrProfiling.c
>   InstrProfilingValue.c
>   InstrProfilingBuffer.c
>   InstrProfilingFile.c
>   InstrProfilingWriter.c
>   InstrProfilingPlatformDarwin.c
>   InstrProfilingPlatformLinux.c
>   InstrProfilingPlatformOther.c
>   InstrProfilingRuntime.cc
>   InstrProfilingUtil.c)
>
> if(WIN32)
>  list(APPEND PROFILE_SOURCES WindowsMMap.c)
> endif()
>
> Let me know if you're OK with the above and I'll push in the fix.
>
> -Nathan
>
> On Tue, Jan 5, 2016 at 4:35 PM, Xinliang David Li <xinliangli at gmail.com> wrote:
>
> Since you are including InstrProfiling.h in WindowsMMap.c, you can
>> probably simply just move that out of #if defined(_WIN32).
>>
>> David
>>
>> On Tue, Jan 5, 2016 at 4:22 PM, Nathan Slingerland via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Hi Justin,
>>>
>>> OK - it should be possible to change it to just add that file to the
>>> list of sources on Windows.
>>>
>>> -Nathan
>>>
>>> On Tue, Jan 5, 2016 at 4:19 PM, Justin Bogner <mail at justinbogner.com>
>>> wrote:
>>>
>>>> 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
>>>>
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160105/2365b6f9/attachment.html>


More information about the llvm-commits mailing list