[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