Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 61 additions & 45 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ if (APPLE AND CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64")
set(APPLE_ARM ON)
endif()

if (WIN32 AND NOT CYGWIN)
# might have to check against msys as well?
# <sys/mman.h>
include_directories(${CMAKE_SOURCE_DIR}/windows/include)
endif()

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
find_package(LLVM REQUIRED)
Expand Down Expand Up @@ -106,28 +112,37 @@ add_dependencies(codonrt zlibstatic gc backtrace bz2 liblzma
re2 hwy hwy_contrib fast_float codonfloat)

if(DEFINED ENV{CODON_SYSTEM_LIBRARIES})
if(APPLE)
set(copied_libgfortran "${CMAKE_BINARY_DIR}/libgfortran.5${CMAKE_SHARED_LIBRARY_SUFFIX}")
set(copied_libquadmath "${CMAKE_BINARY_DIR}/libquadmath.0${CMAKE_SHARED_LIBRARY_SUFFIX}")
set(copied_libgcc "${CMAKE_BINARY_DIR}/libgcc_s.1.1${CMAKE_SHARED_LIBRARY_SUFFIX}")
if (WIN32)
target_link_libraries(codonrt PRIVATE libgfortran)
else()
set(copied_libgfortran "${CMAKE_BINARY_DIR}/libgfortran${CMAKE_SHARED_LIBRARY_SUFFIX}.5")
set(copied_libquadmath "${CMAKE_BINARY_DIR}/libquadmath${CMAKE_SHARED_LIBRARY_SUFFIX}.0")
set(copied_libgcc "${CMAKE_BINARY_DIR}/libgcc_s${CMAKE_SHARED_LIBRARY_SUFFIX}.1")
endif()
if(APPLE)
set(copied_libgfortran "${CMAKE_BINARY_DIR}/libgfortran.5${CMAKE_SHARED_LIBRARY_SUFFIX}")
set(copied_libquadmath "${CMAKE_BINARY_DIR}/libquadmath.0${CMAKE_SHARED_LIBRARY_SUFFIX}")
set(copied_libgcc "${CMAKE_BINARY_DIR}/libgcc_s.1.1${CMAKE_SHARED_LIBRARY_SUFFIX}")
# elseif(WIN32)
# # C:\ProgramData\mingw64\mingw64\bin
# set(copied_libgfortran "${CMAKE_BINARY_DIR}/libgfortran-5${CMAKE_SHARED_LIBRARY_SUFFIX}")
# set(copied_libquadmath "${CMAKE_BINARY_DIR}/libquadmath-0${CMAKE_SHARED_LIBRARY_SUFFIX}")
# set(copied_libgcc "${CMAKE_BINARY_DIR}/libgcc_s_seh-1${CMAKE_SHARED_LIBRARY_SUFFIX}")
else()
set(copied_libgfortran "${CMAKE_BINARY_DIR}/libgfortran${CMAKE_SHARED_LIBRARY_SUFFIX}.5")
set(copied_libquadmath "${CMAKE_BINARY_DIR}/libquadmath${CMAKE_SHARED_LIBRARY_SUFFIX}.0")
set(copied_libgcc "${CMAKE_BINARY_DIR}/libgcc_s${CMAKE_SHARED_LIBRARY_SUFFIX}.1")
endif()

add_custom_command(
OUTPUT ${copied_libgfortran}
DEPENDS "${CMAKE_SOURCE_DIR}/scripts/get_system_libs.sh"
COMMAND ${CMAKE_SOURCE_DIR}/scripts/get_system_libs.sh "$ENV{CODON_SYSTEM_LIBRARIES}" ${CMAKE_BINARY_DIR}
COMMENT "Copying system libraries to build directory")
add_custom_command(
OUTPUT ${copied_libgfortran}
DEPENDS "${CMAKE_SOURCE_DIR}/scripts/get_system_libs.sh"
COMMAND ${CMAKE_SOURCE_DIR}/scripts/get_system_libs.sh "$ENV{CODON_SYSTEM_LIBRARIES}" ${CMAKE_BINARY_DIR}
COMMENT "Copying system libraries to build directory")

add_custom_target(copy_libraries ALL DEPENDS ${copied_libgfortran})
add_dependencies(codonrt copy_libraries)
add_custom_target(copy_libraries ALL DEPENDS ${copied_libgfortran})
add_dependencies(codonrt copy_libraries)

add_library(libgfortran SHARED IMPORTED)
set_target_properties(libgfortran PROPERTIES IMPORTED_LOCATION ${copied_libgfortran})
target_link_libraries(codonrt PRIVATE libgfortran)
add_library(libgfortran SHARED IMPORTED)
set_target_properties(libgfortran PROPERTIES IMPORTED_LOCATION ${copied_libgfortran})
target_link_libraries(codonrt PRIVATE libgfortran)
endif()
else()
message(FATAL_ERROR "Set 'CODON_SYSTEM_LIBRARIES' to the directory containing system libraries.")
endif()
Expand All @@ -137,7 +152,8 @@ target_include_directories(codonrt PRIVATE ${backtrace_SOURCE_DIR}
${highway_SOURCE_DIR}
"${gc_SOURCE_DIR}/include"
"${fast_float_SOURCE_DIR}/include" runtime)
target_link_libraries(codonrt PRIVATE fmt omp backtrace LLVMSupport)
find_package(OpenMP REQUIRED)
target_link_libraries(codonrt PRIVATE fmt OpenMP::OpenMP_CXX backtrace LLVMSupport)
if(APPLE)
target_link_libraries(
codonrt
Expand Down Expand Up @@ -460,31 +476,31 @@ add_custom_target(
add_dependencies(headers codonrt codonc)

# Prepare lib directory for plugin compilation
add_custom_target(
libs ALL
COMMENT "Collecting libraries"
BYPRODUCTS "${CMAKE_BINARY_DIR}/lib"
VERBATIM
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/lib/codon"
COMMAND
${CMAKE_COMMAND} -E copy
"${CMAKE_BINARY_DIR}/libcodonc${CMAKE_SHARED_LIBRARY_SUFFIX}"
"${CMAKE_BINARY_DIR}/lib/codon"
COMMAND
${CMAKE_COMMAND} -E copy
"${CMAKE_BINARY_DIR}/libcodonrt${CMAKE_SHARED_LIBRARY_SUFFIX}"
"${CMAKE_BINARY_DIR}/lib/codon"
COMMAND
${CMAKE_COMMAND} -E copy
"${CMAKE_BINARY_DIR}/libomp${CMAKE_SHARED_LIBRARY_SUFFIX}"
"${CMAKE_BINARY_DIR}/lib/codon"
COMMAND
${CMAKE_COMMAND} -E copy ${copied_libgfortran} "${CMAKE_BINARY_DIR}/lib/codon"
COMMAND
/bin/sh -c "test -f '${copied_libquadmath}' && ${CMAKE_COMMAND} -E copy '${copied_libquadmath}' '${CMAKE_BINARY_DIR}/lib/codon' || true"
COMMAND
${CMAKE_COMMAND} -E copy ${copied_libgcc} "${CMAKE_BINARY_DIR}/lib/codon")
add_dependencies(libs codonrt codonc)
# add_custom_target(
# libs ALL
# COMMENT "Collecting libraries"
# BYPRODUCTS "${CMAKE_BINARY_DIR}/lib"
# VERBATIM
# COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/lib/codon"
# COMMAND
# ${CMAKE_COMMAND} -E copy
# "${CMAKE_BINARY_DIR}/libcodonc${CMAKE_SHARED_LIBRARY_SUFFIX}"
# "${CMAKE_BINARY_DIR}/lib/codon"
# COMMAND
# ${CMAKE_COMMAND} -E copy
# "${CMAKE_BINARY_DIR}/libcodonrt${CMAKE_SHARED_LIBRARY_SUFFIX}"
# "${CMAKE_BINARY_DIR}/lib/codon"
# COMMAND
# ${CMAKE_COMMAND} -E copy
# "${CMAKE_BINARY_DIR}/libomp${CMAKE_SHARED_LIBRARY_SUFFIX}"
# "${CMAKE_BINARY_DIR}/lib/codon"
# COMMAND
# ${CMAKE_COMMAND} -E copy ${copied_libgfortran} "${CMAKE_BINARY_DIR}/lib/codon"
# COMMAND
# /bin/sh -c "test -f '${copied_libquadmath}' && ${CMAKE_COMMAND} -E copy '${copied_libquadmath}' '${CMAKE_BINARY_DIR}/lib/codon' || true"
# COMMAND
# ${CMAKE_COMMAND} -E copy ${copied_libgcc} "${CMAKE_BINARY_DIR}/lib/codon")
# add_dependencies(libs codonrt codonc)

# Codon command-line tool
add_executable(codon codon/app/main.cpp)
Expand Down Expand Up @@ -524,7 +540,7 @@ target_compile_definitions(codon_test
PRIVATE TEST_DIR="${CMAKE_CURRENT_SOURCE_DIR}/test")

install(TARGETS codonrt codonc codon_jupyter DESTINATION lib/codon)
install(FILES ${CMAKE_BINARY_DIR}/libomp${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION lib/codon)
# install(FILES ${CMAKE_BINARY_DIR}/libomp${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION lib/codon)
install(FILES ${copied_libgfortran} DESTINATION lib/codon)
# only install libquadmath if it exists at build time
install(CODE "
Expand Down
12 changes: 12 additions & 0 deletions codon/runtime/lib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,19 @@

#define GC_THREADS
#include "codon/runtime/lib.h"
#ifdef WIN32
// <dlfcn.h> seems to be missing in MinGW (13.2.0), and is likely missing in mvcc anyway
#include <stdio.h>
#include <time.h>
inline struct tm *gmtime_r(const time_t *timep, struct tm *result) {
return gmtime_s(result, timep) == 0 ? result : nullptr;
}
inline struct tm *localtime_r(const time_t *timep, struct tm *result) {
return localtime_s(result, timep) == 0 ? result : nullptr;
}
#else
#include <dlfcn.h>
#endif
#include <gc.h>

#define FASTFLOAT_ALLOWS_LEADING_PLUS
Expand Down
218 changes: 218 additions & 0 deletions windows/include/sys/mman.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
/*
Header only version of https://code.google.com/archive/p/mman-win32/
License: MIT License

Modifications:
- moved the content of mman.c into mman.h
- inlined all functions
- formated the code
*/

#ifndef _SYS_MMAN_H_
#define _SYS_MMAN_H_

#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT \
0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif

/* All the headers include this file. */
#ifndef _MSC_VER
#include <_mingw.h>
#endif

#include <sys/types.h>

#ifdef __cplusplus
extern "C" {
#endif

#define PROT_NONE 0
#define PROT_READ 1
#define PROT_WRITE 2
#define PROT_EXEC 4

#define MAP_FILE 0
#define MAP_SHARED 1
#define MAP_PRIVATE 2
#define MAP_TYPE 0xf
#define MAP_FIXED 0x10
#define MAP_ANONYMOUS 0x20
#define MAP_ANON MAP_ANONYMOUS

#define MAP_FAILED ((void *)-1)

/* Flags for msync. */
#define MS_ASYNC 1
#define MS_SYNC 2
#define MS_INVALIDATE 4

#include <errno.h>
#include <io.h>
#include <windows.h>

#include "mman.h"

#ifndef FILE_MAP_EXECUTE
#define FILE_MAP_EXECUTE 0x0020
#endif /* FILE_MAP_EXECUTE */

inline int __map_mman_error(const DWORD err, const int deferr) {
if (err == 0)
return 0;
// TODO: implement
return err;
}

inline DWORD __map_mmap_prot_page(const int prot) {
DWORD protect = 0;

if (prot == PROT_NONE)
return protect;

if ((prot & PROT_EXEC) != 0) {
protect = ((prot & PROT_WRITE) != 0) ? PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
} else {
protect = ((prot & PROT_WRITE) != 0) ? PAGE_READWRITE : PAGE_READONLY;
}

return protect;
}

inline DWORD __map_mmap_prot_file(const int prot) {
DWORD desiredAccess = 0;

if (prot == PROT_NONE)
return desiredAccess;

if ((prot & PROT_READ) != 0)
desiredAccess |= FILE_MAP_READ;
if ((prot & PROT_WRITE) != 0)
desiredAccess |= FILE_MAP_WRITE;
if ((prot & PROT_EXEC) != 0)
desiredAccess |= FILE_MAP_EXECUTE;

return desiredAccess;
}

inline void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off) {
HANDLE fm, h;

void *map = MAP_FAILED;

#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4293)
#endif

const DWORD dwFileOffsetLow =
(sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)off : (DWORD)(off & 0xFFFFFFFFL);
const DWORD dwFileOffsetHigh =
(sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL);
const DWORD protect = __map_mmap_prot_page(prot);
const DWORD desiredAccess = __map_mmap_prot_file(prot);

const off_t maxSize = off + (off_t)len;

const DWORD dwMaxSizeLow = (sizeof(off_t) <= sizeof(DWORD))
? (DWORD)maxSize
: (DWORD)(maxSize & 0xFFFFFFFFL);
const DWORD dwMaxSizeHigh = (sizeof(off_t) <= sizeof(DWORD))
? (DWORD)0
: (DWORD)((maxSize >> 32) & 0xFFFFFFFFL);

#ifdef _MSC_VER
#pragma warning(pop)
#endif

errno = 0;

if (len == 0
/* Unsupported flag combinations */
|| (flags & MAP_FIXED) != 0
/* Usupported protection combinations */
|| prot == PROT_EXEC) {
errno = EINVAL;
return MAP_FAILED;
}

h = ((flags & MAP_ANONYMOUS) == 0) ? (HANDLE)_get_osfhandle(fildes)
: INVALID_HANDLE_VALUE;

if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE) {
errno = EBADF;
return MAP_FAILED;
}

fm = CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow, NULL);

if (fm == NULL) {
errno = __map_mman_error(GetLastError(), EPERM);
return MAP_FAILED;
}

map = MapViewOfFile(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len);

CloseHandle(fm);

if (map == NULL) {
errno = __map_mman_error(GetLastError(), EPERM);
return MAP_FAILED;
}

return map;
}

inline int munmap(void *addr, size_t len) {
if (UnmapViewOfFile(addr))
return 0;

errno = __map_mman_error(GetLastError(), EPERM);

return -1;
}

inline int mprotect(void *addr, size_t len, int prot) {
DWORD newProtect = __map_mmap_prot_page(prot);
DWORD oldProtect = 0;

if (VirtualProtect(addr, len, newProtect, &oldProtect))
return 0;

errno = __map_mman_error(GetLastError(), EPERM);

return -1;
}

inline int msync(void *addr, size_t len, int flags) {
if (FlushViewOfFile(addr, len))
return 0;

errno = __map_mman_error(GetLastError(), EPERM);

return -1;
}

inline int mlock(const void *addr, size_t len) {
if (VirtualLock((LPVOID)addr, len))
return 0;

errno = __map_mman_error(GetLastError(), EPERM);

return -1;
}

inline int munlock(const void *addr, size_t len) {
if (VirtualUnlock((LPVOID)addr, len))
return 0;

errno = __map_mman_error(GetLastError(), EPERM);

return -1;
}

#ifdef __cplusplus
};
#endif

#endif /* _SYS_MMAN_H_ */