[compiler-rt] r256848 - [PGO] Enable building compiler-rt profile support library on Windows
Nathan Slingerland via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 5 19:06:54 PST 2016
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/e404e99a/attachment.html>
More information about the llvm-commits
mailing list