From a0f0cc197711edf2800f0a72050f4697db3ed131 Mon Sep 17 00:00:00 2001 From: foreman Date: Tue, 14 Jun 2016 15:53:29 -0400 Subject: [PATCH] P4 to Git Change 1279712 by smekhano@stas-rampitec-hsa on 2016/06/14 15:07:52 SWDEV-94189 - HSA Finalizer: do not use temp files New memfile interface is used to emulate files in memory inside perforce build. Testing: smoke, precheckin, test_compiler, vp9 in chrome sandbox Affected files ... ... //depot/stg/opencl/drivers/opencl/compiler/lib/loaders/elf/utils/libelf/_libelf_config.h#4 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/loaders/elf/utils/libelf/elf_begin.c#5 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/loaders/elf/utils/libelf/memfile.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/loaders/elf/utils/libelf/memfile.h#2 edit [ROCm/clr commit: 133f24578ec06c3e148e65062dbf172be25648f1] --- .../loaders/elf/utils/libelf/_libelf_config.h | 26 +++++++ .../lib/loaders/elf/utils/libelf/elf_begin.c | 4 +- .../lib/loaders/elf/utils/libelf/memfile.cpp | 71 ++++++++++++++++++- .../lib/loaders/elf/utils/libelf/memfile.h | 3 + 4 files changed, 101 insertions(+), 3 deletions(-) diff --git a/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/_libelf_config.h b/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/_libelf_config.h index 3116c59d7d..c954303655 100644 --- a/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/_libelf_config.h +++ b/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/_libelf_config.h @@ -260,4 +260,30 @@ typedef struct { #define _chsize(f, l) mem_ftruncate((f), (size_t)(l)) #endif +#if !defined(mmap) +#define mmap mem_mmap +#endif + +#if !defined(mem_munmap) +#define munmap mem_munmap +#endif + +#else // !USE_MEMFILE + +#if !defined(mmap) +#if defined(WIN32) +#define mmap w32_mmap +#else +#define mmap mmap +#endif +#endif + +#if !defined(mem_munmap) +#if defined(WIN32) +#define munmap w32_munmap +#else +#define munmap munmap +#endif +#endif + #endif //USE_MEMFILE diff --git a/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/elf_begin.c b/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/elf_begin.c index af6177b818..410ef1762c 100644 --- a/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/elf_begin.c +++ b/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/elf_begin.c @@ -312,7 +312,7 @@ elf_begin(int fd, Elf_Cmd c, Elf *a, Elf_Mem *mem) // http://www.mingw.org/wiki/FAQ // http://www.mingw.org/license // FIXME: This needs to be more robust to the protection and flag options. -void *mmap(void *start, size_t length, int prot, int flags, int fd, +void *w32_mmap(void *start, size_t length, int prot, int flags, int fd, unsigned offset) { HANDLE handle; @@ -330,7 +330,7 @@ length); } -int munmap(void *start, size_t length) { +int w32_munmap(void *start, size_t length) { UnmapViewOfFile(start); return 0; } diff --git a/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/memfile.cpp b/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/memfile.cpp index cd434fe514..651c1a7505 100644 --- a/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/memfile.cpp +++ b/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/memfile.cpp @@ -12,15 +12,23 @@ #if defined(__GNUC__) #include +#include +#include #else #include +#if !defined(PROT_READ) +#define PROT_READ 0x0004 // FILE_MAP_READ +#endif +#if !defined(MAP_PRIVATE) +#define MAP_PRIVATE 0x0001 // FILE_MAP_COPY +#endif #endif // Allocation granularity #define ALLOC_G 512 #define is_file(fd) ((fd) >= 0) -#if defined(_MSC_VER) +#if defined(_WIN32) #define OPEN ::_open #define READ(f, b, l) ::_read((f), (b), (unsigned int)(l)) @@ -29,6 +37,8 @@ #define LSEEK ::_lseek #define FSTAT ::fstat #define FTRUNC(f, l) ::_chsize((f), (long)(l)) +#define MMAP ::w32_mmap +#define MUNMAP ::w32_munmap #else @@ -39,9 +49,16 @@ #define LSEEK ::lseek #define FSTAT ::fstat #define FTRUNC(f, l) ::ftruncate((f), (off_t)(l)) +#define MMAP ::mmap +#define MUNMAP ::munmap #endif +#if defined(_WIN32) +extern "C" void* w32_mmap(void* start, size_t length, int prot, int flags, int fd, unsigned offset); +extern "C" int w32_munmap(void* start, size_t length); +#endif + namespace amd { // A structure which either maintains in memory file or uses a real file. @@ -175,6 +192,7 @@ public: bool is_open() const { return buf != nullptr; } size_t tell() const { return size_t((char*)curp - (char*)buf); } + void* get() const { return buf; } protected: @@ -324,3 +342,54 @@ int mem_ftruncate(int fd, size_t len) return m->ftruncate(len) ? 0 : -1; } + +off_t mem_sendfile(int out_fd, int in_fd, off_t *offset, size_t count) +{ +#if defined(__GNUC__) + if (is_file(in_fd) && is_file(out_fd)) + return sendfile(out_fd, in_fd, offset, count); +#endif + + off_t start = offset ? *offset : mem_lseek(in_fd, 0, SEEK_CUR); + struct stat sb; + if (mem_fstat(in_fd, &sb) == -1) + return -1; + if (start < 0 || sb.st_size <= start) + return 0; + count = std::min(count, (size_t)(sb.st_size - start)); + void *in = mem_mmap(NULL, count, PROT_READ, MAP_PRIVATE, in_fd, start); + if ((void*)-1 == in) + return -1; + + off_t written = mem_write(out_fd, in, count); + mem_munmap(in, count); + if (written < 0) + return -1; + + if (offset) { + *offset += written; + } else { + if (mem_lseek(in_fd, written, SEEK_CUR) < 0) + return -1; + } + + return written; +} + +void* mem_mmap(void* start, size_t length, int prot, int flags, int fd, unsigned offset) +{ + if (is_file(fd)) + return MMAP(start, length, prot, flags, fd, offset); + + memfile_t *m = get_memfile(fd); + if (!m) + return (void*)-1; + + return (char*)m->get() + offset; +} + +int mem_munmap(void* start, size_t length) +{ + MUNMAP(start, length); + return 0; +} diff --git a/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/memfile.h b/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/memfile.h index 95f8851c12..2e8310b405 100644 --- a/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/memfile.h +++ b/projects/clr/rocclr/compiler/lib/loaders/elf/utils/libelf/memfile.h @@ -22,6 +22,9 @@ extern int mem_close(int fd); extern off_t mem_lseek(int fd, off_t offset, int origin); extern int mem_fstat(int fd, struct stat *buf); extern int mem_ftruncate(int fd, size_t len); +extern off_t mem_sendfile(int out_fd, int in_fd, off_t *offset, size_t count); +extern void* mem_mmap(void* start, size_t length, int prot, int flags, int fd, unsigned offset); +extern int mem_munmap(void* start, size_t length); #if defined(__cplusplus) }