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

Nathan Slingerland via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 6 09:01:38 PST 2016


Ah - I now I see what you meant.

I went with the original patch since the WindowsMMap.c should only ever
apply to WIN32. Committed as r256947.

On Tue, Jan 5, 2016 at 7:11 PM, Xinliang David Li <xinliangli at gmail.com>
wrote:

> 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/20160106/e7be2d0a/attachment.html>


More information about the llvm-commits mailing list