summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoff Norton <grompf@gmail.com>2015-02-03 21:18:43 -0800
committerGeoff Norton <grompf@gmail.com>2015-02-06 16:24:36 -0800
commit495c00ff2353f1bf49e085c646fdd4b4ec658bba (patch)
tree4c7937a9b002578dcf4835d55dcbc52901f7d184
parenta85beebc633d373bf3df4241ce7f86d76d7690ec (diff)
downloadcoreclr-495c00ff2353f1bf49e085c646fdd4b4ec658bba.tar.gz
coreclr-495c00ff2353f1bf49e085c646fdd4b4ec658bba.tar.bz2
coreclr-495c00ff2353f1bf49e085c646fdd4b4ec658bba.zip
Initial Mac OSX Support
Supports building up the VM, PAL and various components on Mac OSX 10.10 There are some oddities with the Apple assembler not generating short jumps and not supporting 1 byte relocs.
-rw-r--r--.gitignore4
-rw-r--r--CMakeLists.txt23
-rwxr-xr-xbuild.sh15
-rw-r--r--src/coreclr/hosts/unixcorerun/corerun.cpp4
-rw-r--r--src/debug/di/amd64/floatconversion.S2
-rw-r--r--src/debug/ee/amd64/dbghelpers.S4
-rw-r--r--src/dlls/mscoree/coreclr/CMakeLists.txt9
-rw-r--r--src/pal/inc/pal.h29
-rw-r--r--src/pal/src/CMakeLists.txt36
-rw-r--r--src/pal/src/arch/i386/context.clang.s15
-rw-r--r--src/pal/src/arch/i386/context.cpp11
-rw-r--r--src/pal/src/arch/i386/dispatchexceptionwrapper.s2
-rw-r--r--src/pal/src/config.h533
-rw-r--r--src/pal/src/config.h.linux531
-rw-r--r--src/pal/src/config.h.osx533
-rw-r--r--src/pal/src/cruntime/path.cpp7
-rw-r--r--src/pal/src/cruntime/wchar.cpp5
-rw-r--r--src/pal/src/examples/CMakeLists.txt2
-rw-r--r--src/pal/src/exception/machexception.cpp2
-rw-r--r--src/pal/src/exception/machmessage.cpp2
-rw-r--r--src/pal/src/exception/machmessage.h4
-rw-r--r--src/pal/src/file/file.cpp12
-rw-r--r--src/pal/src/loader/module.cpp664
-rw-r--r--src/pal/src/locale/locale.cpp50
-rw-r--r--src/pal/src/locale/unicode.cpp4
-rw-r--r--src/pal/src/memory/heap.cpp2
-rw-r--r--src/pal/src/misc/fmtmessage.cpp49
-rw-r--r--src/pal/src/misc/miscpalapi.cpp63
-rw-r--r--src/pal/src/misc/version.cpp2
-rw-r--r--src/pal/tools/cppmunge/cppmunge.c2
-rwxr-xr-xsrc/pal/tools/gen-buildsys-clang.sh30
-rw-r--r--src/vm/amd64/cgencpu.h2
-rw-r--r--src/vm/amd64/jithelpers_fast.S35
-rw-r--r--src/vm/amd64/jithelpers_fastwritebarriers.S68
-rw-r--r--src/vm/amd64/jithelpers_slow.S2
-rw-r--r--src/vm/amd64/theprestubamd64.S4
-rw-r--r--src/vm/amd64/unixasmhelpers.S27
-rw-r--r--src/vm/amd64/unixasmmacros.inc26
-rw-r--r--src/vm/amd64/unixstubs.cpp5
-rw-r--r--src/vm/amd64/virtualcallstubamd64.S8
40 files changed, 1365 insertions, 1463 deletions
diff --git a/.gitignore b/.gitignore
index 53349ead37..83808394eb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -250,3 +250,7 @@ Temporary Items
# Ignore folders created by the test build
TestWrappers_x64_debug
TestWrappers_x64_release
+
+Vagrantfile
+.vagrant
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index aa0ad09ef8..56e4ee84cc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,8 +7,16 @@ project(CoreCLR)
if(CMAKE_SYSTEM_NAME STREQUAL Linux)
set(CLR_CMAKE_PLATFORM_UNIX 1)
set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
+ set(CLR_CMAKE_PLATFORM_LINUX 1)
endif(CMAKE_SYSTEM_NAME STREQUAL Linux)
+if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
+ set(CLR_CMAKE_PLATFORM_UNIX 1)
+ set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
+ set(CLR_CMAKE_PLATFORM_DARWIN 1)
+ set(CMAKE_ASM_COMPILE_OBJECT "${CMAKE_C_COMPILER} <FLAGS> <DEFINES> -o <OBJECT> -c <SOURCE>")
+endif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
+
# Build a list of compiler definitions by putting -D in front of each define.
function(get_compile_definitions DefinitionName)
# Get the current list of definitions
@@ -126,7 +134,7 @@ if (WIN32)
endif (CMAKE_SYSTEM_PROCESSOR STREQUAL AMD64)
elseif (CLR_CMAKE_PLATFORM_UNIX)
- # Set flag to indicate if this will be a 64bit Linux build
+ # Set flag to indicate if this will be a 64bit build
if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
set(IS_64BIT_BUILD 1)
endif (CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
@@ -285,17 +293,24 @@ endif (WIN32)
if (CLR_CMAKE_PLATFORM_UNIX)
add_definitions(-DPLATFORM_UNIX=1)
- add_definitions(-D__LINUX__=1)
add_definitions(-DFEATURE_PAL_SXS)
if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
- message("Detected Linux x86_64")
- add_definitions(-DLINUX64)
add_definitions(-DBIT64=1)
add_definitions(-DFEATURE_PAL)
else (CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
message(FATAL_ERROR "error: Detected non x86_64 target processor. Not supported!")
endif(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
+
+ if(CLR_CMAKE_PLATFORM_LINUX)
+ add_definitions(-D__LINUX__=1)
+ message("Detected Linux x86_64")
+ add_definitions(-DLINUX64)
+ endif(CLR_CMAKE_PLATFORM_LINUX)
+ if(CLR_CMAKE_PLATFORM_DARWIN)
+ message("Detected OSX x86_64")
+ add_definitions(-D_XOPEN_SOURCE)
+ endif(CLR_CMAKE_PLATFORM_DARWIN)
endif(CLR_CMAKE_PLATFORM_UNIX)
diff --git a/build.sh b/build.sh
index 61b3cbc66e..f9963fc1cd 100755
--- a/build.sh
+++ b/build.sh
@@ -62,6 +62,21 @@ check_prereqs()
build_coreclr()
{
+ #determine nproc in a platform independent way
+ NPROCS=1
+ OS=`uname`
+
+ if [ $OS = "Linux" ]; then
+ NPROCS=`grep -c ^processor /proc/cpuinfo`
+ elif [ $OS = "Darwin" ]; then
+ NPROCS=`sysctl hw.ncpu | awk '{print $2}'`
+ else
+ echo Failed to detect build platform.
+ exit 1
+ fi
+
+ NPROCS=1
+
# All set to commence the build
echo Commencing build of native components for $__BuildArch/$__BuildType
diff --git a/src/coreclr/hosts/unixcorerun/corerun.cpp b/src/coreclr/hosts/unixcorerun/corerun.cpp
index 2d5f129398..4dba489579 100644
--- a/src/coreclr/hosts/unixcorerun/corerun.cpp
+++ b/src/coreclr/hosts/unixcorerun/corerun.cpp
@@ -17,7 +17,11 @@
#include <set>
// The name of the CoreCLR native runtime DLL.
+#if defined(__APPLE__)
+static const char * const coreClrDll = "libcoreclr.dylib";
+#else
static const char * const coreClrDll = "libcoreclr.so";
+#endif
// Windows types used by the ExecuteAssembly function
typedef unsigned int DWORD;
diff --git a/src/debug/di/amd64/floatconversion.S b/src/debug/di/amd64/floatconversion.S
index bde59abaf1..cea9cc97df 100644
--- a/src/debug/di/amd64/floatconversion.S
+++ b/src/debug/di/amd64/floatconversion.S
@@ -9,4 +9,4 @@
LEAF_ENTRY FPFillR8, _TEXT
movdqa xmm0, [rdi]
ret
-LEAF_END FPFillR8
+LEAF_END FPFillR8, _TEXT
diff --git a/src/debug/ee/amd64/dbghelpers.S b/src/debug/ee/amd64/dbghelpers.S
index f652312175..7debc0e26e 100644
--- a/src/debug/ee/amd64/dbghelpers.S
+++ b/src/debug/ee/amd64/dbghelpers.S
@@ -17,7 +17,7 @@ NESTED_ENTRY FuncEvalHijack, _TEXT, FuncEvalHijackPersonalityRoutine
END_PROLOGUE
mov [rsp], rdi
- call FuncEvalHijackWorker
+ call C_FUNC(FuncEvalHijackWorker)
//
// The following nop is crucial. It is important that the OS *not* recognize
@@ -67,7 +67,7 @@ NESTED_ENTRY ExceptionHijack, _TEXT, ExceptionHijackPersonalityRoutine
mov [rsp + 18h], rax
// DD Hijack primitive already set the stack. So just make the call now.
- call ExceptionHijackWorker
+ call C_FUNC(ExceptionHijackWorker)
//
// The following nop is crucial. It is important that the OS *not* recognize
diff --git a/src/dlls/mscoree/coreclr/CMakeLists.txt b/src/dlls/mscoree/coreclr/CMakeLists.txt
index d17df90ffb..8393cbc0dd 100644
--- a/src/dlls/mscoree/coreclr/CMakeLists.txt
+++ b/src/dlls/mscoree/coreclr/CMakeLists.txt
@@ -12,14 +12,17 @@ set(END_LIBRARY_GROUP)
else(WIN32)
add_definitions(-DNO_CRT_INIT)
+
+if(CMAKE_SYSTEM_NAME STREQUAL Linux)
# This option is necessary to ensure that the overloaded delete operator defined inside
# of the utilcode will be used instead of the standard library delete operator.
-set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -Bsymbolic-functions")
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -Bsymbolic-functions")
# The following linked options can be inserted into the linker libraries list to
# ensure proper resolving of circular references between a subset of the libraries.
-set(START_LIBRARY_GROUP -Wl,--start-group)
-set(END_LIBRARY_GROUP -Wl,--end-group)
+ set(START_LIBRARY_GROUP -Wl,--start-group)
+ set(END_LIBRARY_GROUP -Wl,--end-group)
+endif(CMAKE_SYSTEM_NAME STREQUAL Linux)
endif (WIN32)
diff --git a/src/pal/inc/pal.h b/src/pal/inc/pal.h
index 6eb2f91007..48f7ebc8a3 100644
--- a/src/pal/inc/pal.h
+++ b/src/pal/inc/pal.h
@@ -3280,37 +3280,10 @@ GetModuleFileNameW(
#define GetModuleFileName GetModuleFileNameA
#endif
-#ifdef __APPLE__
-// Get the base address of a module given an address in that module
-PALAPI
-LPCVOID
-PAL_GetModuleBaseFromAddress(LPCVOID pAddress);
-
-// Retrieve the UUID in the image.
-PALAPI
-BOOL
-PAL_GetUUIDOfImage(LPCVOID pImageBase, BYTE * pUUID);
-
-// Retrieve the version stored in the Info.plist file in the CoreCLR bundle.
-PALAPI
-DWORD
-PAL_GetVersionString(IN WCHAR * pwszCoreClrFullPath,
- IN OUT WCHAR * pwszVersionString,
- IN DWORD cchVersionStringBuffer,
- OUT DWORD *pcchVersionStringBufferRequired);
-
-PALAPI
-DWORD
-PAL_GetCoreCLRVersionString(
- IN OUT WCHAR * pwszVersionString,
- IN DWORD cchVersionStringBuffer,
- OUT DWORD *pcchVersionStringBufferRequired);
-#else // __APPLE__
// Get base address of the coreclr module
PALAPI
LPCVOID
PAL_GetCoreClrModuleBase();
-#endif // __APPLE__
PALIMPORT
LPVOID
@@ -6139,7 +6112,7 @@ PAL_CppRethrow();
//
#ifdef PLATFORM_UNIX
#ifdef __APPLE__
-#define MAKEDLLNAME_W(name) L"lib" name L".dylib"
+#define MAKEDLLNAME_W(name) u"lib" name u".dylib"
#define MAKEDLLNAME_A(name) "lib" name ".dylib"
#elif defined(_AIX)
#define MAKEDLLNAME_W(name) L"lib" name L".a"
diff --git a/src/pal/src/CMakeLists.txt b/src/pal/src/CMakeLists.txt
index e983b001c8..9401e00592 100644
--- a/src/pal/src/CMakeLists.txt
+++ b/src/pal/src/CMakeLists.txt
@@ -9,8 +9,22 @@ include_directories(include)
# Compile options
+if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
+ add_definitions(-D_TARGET_MAC64)
+ set(PLATFORM_SOURCES
+ arch/i386/context.clang.s
+ arch/i386/dispatchexceptionwrapper.S
+ exception/machexception.cpp
+ exception/machmessage.cpp
+ locale/locale.cpp
+ )
+endif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
+
+if(CMAKE_SYSTEM_NAME STREQUAL Linux)
+ add_definitions(-D__LINUX__=1)
+endif(CMAKE_SYSTEM_NAME STREQUAL Linux)
+
add_definitions(-DPLATFORM_UNIX=1)
-add_definitions(-D__LINUX__=1)
add_definitions(-DLP64COMPATIBLE=1)
add_definitions(-DFEATURE_PAL=1)
add_definitions(-DCORECLR=1)
@@ -128,14 +142,30 @@ set(SOURCES
add_library(CoreClrPal
STATIC
${SOURCES}
+ ${PLATFORM_SOURCES}
)
target_link_libraries(CoreClrPal
- pthread
- rt
dl
m
)
+if(CMAKE_SYSTEM_NAME STREQUAL Linux)
+target_link_libraries(CoreClrPal
+ pthread
+ rt
+)
+endif(CMAKE_SYSTEM_NAME STREQUAL Linux)
+
+if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
+ find_library(COREFOUNDATION CoreFoundation)
+ find_library(CORESERVICES CoreServices)
+ find_library(SECURITY Security)
+ target_link_libraries(CoreClrPal
+ ${COREFOUNDATION}
+ ${CORESERVICES}
+ ${SECURITY}
+ )
+endif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
add_subdirectory(examples)
diff --git a/src/pal/src/arch/i386/context.clang.s b/src/pal/src/arch/i386/context.clang.s
new file mode 100644
index 0000000000..b13de6d7da
--- /dev/null
+++ b/src/pal/src/arch/i386/context.clang.s
@@ -0,0 +1,15 @@
+ .text
+ .globl _DBG_CheckStackAlignment
+
+_DBG_CheckStackAlignment:
+ // Prolog - at this point we are at aligned - 8 (for the call)
+ pushq %rbp // aligned -16
+ movq %rsp, %rbp
+
+ testl $0xf,%esp // can get away with esp even on AMD64.
+ jz .+3
+ int3
+
+ // Epilog
+ popq %rbp
+ ret
diff --git a/src/pal/src/arch/i386/context.cpp b/src/pal/src/arch/i386/context.cpp
index 7b5c1fab0d..ffccf0f67b 100644
--- a/src/pal/src/arch/i386/context.cpp
+++ b/src/pal/src/arch/i386/context.cpp
@@ -1143,7 +1143,7 @@ CONTEXT_SetThreadContextOnPort(
// the xmm values) then we don't have values for the other set. This is a problem since Mach only
// supports setting both groups as a single unit. So in this case we'll need to fetch the current
// values first.
- if (lpContext->ContextFlags & CONTEXT_ALL_FLOATING !=
+ if ((lpContext->ContextFlags & CONTEXT_ALL_FLOATING) !=
CONTEXT_ALL_FLOATING)
{
mach_msg_type_number_t StateCountGet = StateCount;
@@ -1321,10 +1321,11 @@ Function:
This function interrupts otherwise.
--*/
// Bullseye has parsing problems if "asm" comes after VOID
-asm VOID
+
+#ifndef __clang__
+VOID
DBG_CheckStackAlignment()
{
-#ifndef __llvm__
#ifdef _X86_
// Prolog - at this point we are at aligned - 4 (for the call)
push ebp // aligned - 8
@@ -1337,16 +1338,14 @@ DBG_CheckStackAlignment()
#else
#error Unexpected architecture.
#endif
-#endif // !__llvm__
test esp,STACK_ALIGN_REQ-1 // can get away with esp even on AMD64.
jz .+3
int 3
-#ifndef __llvm__
// Epilog
leave
-#endif // !__llvm__
}
+#endif // !__clang__
#endif // DEBUG && APPLE
diff --git a/src/pal/src/arch/i386/dispatchexceptionwrapper.s b/src/pal/src/arch/i386/dispatchexceptionwrapper.s
index 831ce93f54..952e5a0cbb 100644
--- a/src/pal/src/arch/i386/dispatchexceptionwrapper.s
+++ b/src/pal/src/arch/i386/dispatchexceptionwrapper.s
@@ -18,7 +18,7 @@
// increase the size of the function to include a call statement,
// even though it will never be executed.
-#if defined(_AMD64_)
+#if defined(__x86_64__)
#define PAL_DISPATCHEXCEPTION __Z21PAL_DispatchExceptionmmmmmmP8_CONTEXTP17_EXCEPTION_RECORD
#else //!defined(_AMD64_)
#define PAL_DISPATCHEXCEPTION __Z21PAL_DispatchExceptionP8_CONTEXTP17_EXCEPTION_RECORD
diff --git a/src/pal/src/config.h b/src/pal/src/config.h
index 554061ddfc..904d85e27f 100644
--- a/src/pal/src/config.h
+++ b/src/pal/src/config.h
@@ -1,528 +1,5 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-/* config.h. Generated from config.h.in by configure. */
-/*++
-
-
-
-Module Name:
-
- include/pal/config.h.in
-
- process this file with configure to create the PAL's configuration header
-
---*/
-
-#ifndef _PAL_CONFIG_H_INCLUDED
-#define _PAL_CONFIG_H_INCLUDED 1
-
-/*++
-_NO_DEBUG_MESSAGES_ : configure option --disable-dbgmsg
-
-This turns off compilation of TRACE, WARN, ERROR and ENTRY debug messages
---*/
-
-#define _NO_DEBUG_MESSAGES_ 0
-
-
-/*++
-CHECK_TRACE_SPECIFIERS : configure option --enable-tracechecks
-
-Ask gcc to check the format specifiers used in trace macros. Not on by default,
-because gcc will complain about %I64d and %S
---*/
-
-#define CHECK_TRACE_SPECIFIERS 0
-
-/* Define as 1 if you have wchar.h. */
-#define HAVE_WCHAR_H 1
-
-/* Define as 1 if you have ieeefp.h. */
-#define HAVE_IEEEFP_H 0
-
-/* Define as 1 if you have alloca.h. */
-#define HAVE_ALLOCA_H 1
-
-/* Define as 1 if you have stdint.h. */
-#define HAVE_STDINT_H 1
-
-/* Define as 1 if you have netdb.h. */
-#define HAVE_NETDB_H 1
-
-/* Define as 1 if you have inttypes.h. */
-#define HAVE_INTTYPES_H 1
-
-/* Define as 1 if you have sys/vmparam.h. */
-#define HAVE_SYS_VMPARAM_H 0
-
-/* Define as 1 if you have mach/vm_types.h. */
-#define HAVE_MACH_VM_TYPES_H 0
-
-/* Define as 1 if you have mach/vm_param.h. */
-#define HAVE_MACH_VM_PARAM_H 0
-
-/* Define as 1 if you have sys/param.h. */
-#define HAVE_SYS_PARAM_H 1
-
-/* Define as 1 if you have sys/filio.h. */
-#define HAVE_SYS_FILIO_H 0
-
-/* Define as 1 if you have sys/sockio.h. */
-#define HAVE_SYS_SOCKIO_H 0
-
-/* Define as 1 if you have procfs.h. */
-#define HAVE_PROCFS_H 0
-
-/* Define as 1 if you have sys/event.h. */
-#define HAVE_KQUEUE 0
-
-// Define as 1 if you are using dylibs and need dlcompat.
-#define NEED_DLCOMPAT 0
-
-/* Define as 1 if you have crt_externs.h. */
-#define HAVE_CRT_EXTERNS_H 0
-
-// Define as 1 if you have sys/time.h.
-#define HAVE_SYS_TIME_H 1
-
-/* Define as 1 if you have pthread_np.h */
-#define HAVE_PTHREAD_NP_H 0
-
-/* Define as 1 if you have sys/lwp.h */
-#define HAVE_SYS_LWP_H 0
-
-/* Define as 1 if you have towlower. */
-#define HAVE_TOWLOWER 0
-
-/* Define as 1 if struct stat contains st_atimespec, etc. */
-#define HAVE_STAT_TIMESPEC 0
-
-/* Define as 1 if struct stat contains st_atimensec, etc. */
-#define HAVE_STAT_NSEC 0
-
-/* Define as 1 if struct sockaddr contains sa_len. */
-#define HAVE_SOCKADDR_SA_LEN 0
-
-/* Define as 1 if getpwuid_r function exists. */
-#define HAVE_GETPWUID_R 1
-
-/* Define as 1 if you have extern char *tzname. */
-#define HAVE_TZNAME 1
-
-/* Define as 1 if you have extern long int timezone. */
-#define HAVE_TIMEZONE_VAR 0
-
-/* Define as 1 if struct tm has tm_gmtoff. */
-#define HAVE_TM_GMTOFF 1
-
-// Define as 1 if the BSD struct reg is supported.
-#define HAVE_BSD_REGS_T 0
-
-// Define as 1 if ptrace's struct pt_regs is supported.
-#define HAVE_PT_REGS 1
-
-// Define as 1 if mcontext_t contains a gregset_t.
-#define HAVE_GREGSET_T 1
-
-// Define as 1 if realpath() does not require that the last path component
-// be a file.
-#define REALPATH_SUPPORTS_NONEXISTENT_FILES 0
-
-// Define as 1 if sscanf supports the "%ll" format.
-#define SSCANF_SUPPORT_ll 0
-
-// Define as 1 if sscanf has trouble parsing a float from
-// something like "12.34e" (e.g. AIX)
-#define SSCANF_CANNOT_HANDLE_MISSING_EXPONENT 0
-
-// Define as 1 if snprintf works correctly for large values of n.
-#define HAVE_LARGE_SNPRINTF_SUPPORT 1
-
-/* Define as 1 if select() on a fifo that has not had any data
- written to it returns that data is available for reading. */
-#define HAVE_BROKEN_FIFO_SELECT 0
-
-/* Define as 1 if kevent() on a fifo returns EV_ERROR. */
-#define HAVE_BROKEN_FIFO_KEVENT 1
-
-// Define as 1 if ftruncate correctly returns failure on large lengths.
-#define HAVE_FTRUNCATE_LARGE_LENGTH_SUPPORT 0
-
-// Define as 1 if ftruncate returns failure but extends the file anyway.
-#define HAS_FTRUNCATE_LENGTH_ISSUE 0
-
-/* Define as 1 if SYS_yield is a supported syscall. */
-#define HAVE_YIELD_SYSCALL 0
-
-// Define as 1 if pthreads are Mach threads.
-#define HAVE_MACH_THREADS 0
-
-// Define as 1 if pthreads are Solaris threads.
-#define HAVE_SOLARIS_THREADS 0
-
-// Define as 1 if pthreads has pthread_suspend
-#define HAVE_PTHREAD_SUSPEND 0
-
-// Define as 1 if pthreads has pthread_suspend_np
-#define HAVE_PTHREAD_SUSPEND_NP 0
-
-// Define as 1 if pthreads has pthread_continue
-#define HAVE_PTHREAD_CONTINUE 0
-
-// Define as 1 if pthreads has pthread_resume_np
-#define HAVE_PTHREAD_RESUME_NP 0
-
-// Define as 1 if pthreads has pthread_continue_np
-#define HAVE_PTHREAD_CONTINUE_NP 0
-
-// Define as 1 if mkstemp64 is used instead of mkstemp
-#define MKSTEMP64_IS_USED_INSTEAD_OF_MKSTEMP 0
-
-// Define as 1 if open64 is used instead of open
-#define OPEN64_IS_USED_INSTEAD_OF_OPEN 0
-
-// Define as 1 if pthread has thread_self
-#define HAVE_THREAD_SELF 0
-
-// Define as 1 if pthread has _lwp_self
-#define HAVE__LWP_SELF 0
-
-// Define as 1 if sched_get_priority_[min|max] is supported
-#define HAVE_SCHED_GET_PRIORITY 1
-
-// Define as the hardcoded min and max thread priority (for platforms where
-// sched_get_priority_[min|max] does not exist
-#define PAL_THREAD_PRIORITY_MIN 0
-#define PAL_THREAD_PRIORITY_MAX 0
-
-// Define as 1 if pthread_setschedparam requires special privileges
-#define SET_SCHEDPARAM_NEEDS_PRIVS 0
-
-/* Define as 1 if Mach exceptions are supported. */
-#define HAVE_MACH_EXCEPTIONS 0
-
-// Define as 1 if Mach's vm_read and vm_write are supported.
-#define HAVE_VM_READ 0
-
-/* Define as 1 if sigreturn is supported. */
-#define HAVE_SIGRETURN 0
-
-/* Define as 1 if _thread_sys_sigreturn is supported. */
-#define HAVE__THREAD_SYS_SIGRETURN 0
-
-// Define as 1 if setcontext is supported.
-#define HAVE_SETCONTEXT 1
-
-// Define as 1 if getcontext is supported.
-#define HAVE_GETCONTEXT 1
-
-// Define as 1 if copysign is supported.
-#define HAVE_COPYSIGN 1
-
-// Define as 1 if gethrtime (Solaris/HPUX) is supported.
-#define HAVE_GETHRTIME 0
-
-// Define as 1 if read_real_time (AIX) is supported.
-#define HAVE_READ_REAL_TIME 0
-
-// Define as 1 if fsync is supported.
-#define HAVE_FSYNC 1
-
-// Define as 1 if current platform has a working gettimeofday
-#define HAVE_WORKING_GETTIMEOFDAY 1
-
-// Define as 1 if current platform has a working clock_gettime
-#define HAVE_WORKING_CLOCK_GETTIME 1
-
-// Define as 1 if clock_gettime supports CLOCK_MONOTONIC.
-#define HAVE_CLOCK_MONOTONIC 1
-
-/* Define as 1 if futimes is supported. */
-#define HAVE_FUTIMES 1
-
-/* Define as 1 if utimes is supported. */
-#define HAVE_UTIMES 1
-
-/* Define as 1 if sysctl is supported. */
-#define HAVE_SYSCTL 1
-
-/* Define as 1 if sysconf is supported. */
-#define HAVE_SYSCONF 1
-
-/* Define as 1 if strtok_r is supported. */
-#define HAVE_STRTOK_R 1
-
-/* Define as 1 if localtime_r is supported. */
-#define HAVE_LOCALTIME_R 1
-
-/* Define as 1 if ctime_r is supported. */
-#define HAVE_CTIME_R 1
-
-/* Defined as 1 if gmtime_r is supported. */
-#define HAVE_GMTIME_R 1
-
-/* Define as 1 if timegm is supported. */
-#define HAVE_TIMEGM 1
-
-/* Define as 1 if _snwprintf is supported. */
-#define HAVE__SNWPRINTF 0
-
-// Define as 1 if poll is supported.
-#define HAVE_POLL 1
-
-// Define as 1 if INFTIM is defined.
-#define HAVE_INFTIM 0
-
-// Define as 1 if CHAR_BIT is defined
-#define HAVE_CHAR_BIT 0
-
-/* Define as 1 if directio is supported. */
-#define HAVE_DIRECTIO 0
-
-/* Define as 1 if use of directio is disabled,
- even if HAVE_DIRECTIO is defined. */
-#define DIRECTIO_DISABLED 0
-
-/* Define as 1 if vm_allocate is supported. */
-#define HAVE_VM_ALLOCATE 0
-
-/* Define as 1 if statfs is supported. */
-#define HAVE_STATFS 0
-
-/* Define as 1 if statvfs is supported. */
-#define HAVE_STATVFS 1
-
-/* Define as 1 if statvfs64 prototype is broken. */
-#define STATVFS64_PROTOTYPE_BROKEN 0
-
-/* Define as 1 if siginfo_t is supported. */
-#define HAVE_SIGINFO_T 1
-
-/* Define as 1 if ucontext_t is supported. */
-#define HAVE_UCONTEXT_T 1
-
-/* Defined to sizeof(off_t). */
-#define SIZEOF_OFF_T 8
-
-/* Define as 1 if in_addr_t is supported. */
-#define HAVE_IN_ADDR_T 0
-
-// Define as 1 if caddr_t is supported.
-#define HAVE_CADDR_T 0
-
-/* Define as 1 if socklen_t is supported. */
-#define HAVE_SOCKLEN_T 1
-
-/* Define as 1 if sockaddr_ext is supported. */
-#define HAVE_SOCKADDR_EXT 0
-
-/* Define as 1 if pthread_rwlock_t is supported. */
-#define HAVE_PTHREAD_RWLOCK_T 1
-
-/* Define as 1 if Core Foundation is supported (Darwin/Mac OS X only). */
-#define HAVE_COREFOUNDATION 0
-
-/* Define as 1 if _NSGetEnviron is supported (Darwin/Mac OS X only). */
-#define HAVE__NSGETENVIRON 0
-
-/* Define this if debug channel output should be appended to existing files
- instead of overwriting */
-/* #undef _PAL_APPEND_DBG_OUTPUT_ */
-
-/* Define as 1 if mmap() can map a file descriptor for /dev/zero */
-#define HAVE_MMAP_DEV_ZERO 1
-
-// Define as 1 if mmap() ignores its hint parameter.
-#define MMAP_IGNORES_HINT 0
-
-// Define as 1 if mmap() ignores its protection parameter when
-// mapping anonymous pages.
-#define MMAP_ANON_IGNORES_PROTECTION 0
-
-// Define as 1 if mmap() allows remapping previously mapped pages
-#define MMAP_DOESNOT_ALLOW_REMAP 0
-
-// Define as 1 if there cannot be more than one shared mapping of a file
-// region per process at the same time
-#define ONE_SHARED_MAPPING_PER_FILEREGION_PER_PROCESS 0
-
-// Define as 1 if pthread_create() modifies errno when it succeeds.
-#define PTHREAD_CREATE_MODIFIES_ERRNO 0
-
-// Define as 1 if sem_init() modifies errno when it succeeds.
-#define SEM_INIT_MODIFIES_ERRNO 0
-
-// Define as 1 if prwatch_t is supported
-#define HAVE_PRWATCH_T 0
-
-// Define as 1 if /proc/<pid>/ctl is supported.
-#define HAVE_PROCFS_CTL 0
-
-// Define as the name of the memory file in /proc/<pid>
-#define PROCFS_MEM_NAME ""
-
-// Define as 1 if including sys/user.h will result in
-// _DEBUG being defined
-#define USER_H_DEFINES_DEBUG 0
-
-// Define as 1 if close(fd) blocks until there is any outstanding
-// syscall using fd (e.g. AIX)
-#define CLOSE_BLOCKS_ON_OUTSTANDING_SYSCALLS 0
-
-// Define as 1 if sendto returns EHOSTUNREACH when sendto'ing using a
-// "to" sockaddr which does not match the socket address family
-// (e.g. AIX)
-#define SENDTO_RETURNS_UNREACH_ON_WRONG_AF 0
-
-// Define as 1 if shutdown fails on connectionless sockets
-// (e.g. AIX)
-#define SHUTDOWN_FAILS_ON_CONNECTIONLESS_SOCKETS 1
-
-// Define as 1 if it is possible to broadcast on a socket regardless of SO_BROADCAST
-// (e.g. Solaris)
-#define BROADCAST_ALLOWED_WITHOUT_SO_BROADCAST 0
-
-// Define as 1 if SO_RCVTIMEO and SO_SNDTIMEO are not supported
-// or are ignored
-#define SO_TIMEO_NOT_SUPPORTED 0
-
-// Define as 1 if write of 0 bytes to the console hangs.
-#define WRITE_0_BYTES_HANGS_TTY 0
-
-// Define as 1 if acos is compatible with Windows.
-#define HAVE_COMPATIBLE_ACOS 1
-
-// Define as 1 if asin is compatible with Windows.
-#define HAVE_COMPATIBLE_ASIN 1
-
-// Define as 1 if pow is compatible with Windows.
-#define HAVE_COMPATIBLE_POW 0
-
-// Define as 1 if pow returns -Inf when given a negative base and a
-// large magnitude odd exponent.
-#define HAVE_VALID_NEGATIVE_INF_POW 1
-
-// Define as 1 if pow returns +Inf when given a negative base and a
-// large magnitude even exponent.
-#define HAVE_VALID_POSITIVE_INF_POW 1
-
-// Define as 1 if atan2 is compatible with Windows.
-#define HAVE_COMPATIBLE_ATAN2 1
-
-// Define as 1 if exp is compatible with Windows.
-#define HAVE_COMPATIBLE_EXP 1
-
-// Define as 1 if log is compatible with Windows.
-#define HAVE_COMPATIBLE_LOG 1
-
-// Define as 1 if log10 is compatible with Windows.
-#define HAVE_COMPATIBLE_LOG10 1
-
-// Define as 1 if ttrace is supported
-#define HAVE_TTRACE 0
-
-// Define as 1 if calling dlopen() on a library which is already
-// opened returns a different handle
-#define RETURNS_NEW_HANDLES_ON_REPEAT_DLOPEN 0
-
-// If 1, SetThreadPriority() will not actually modify the pthread priority
-// for threads which aren't critical or idle
-#define PAL_IGNORE_NORMAL_THREAD_PRIORITY 0
-
-// Define as a macro that correctly calls ptrace for the platform, e.g.:
-// #define PAL_PTRACE(cmd, pid, addr, data) ptrace((cmd), (pid), (void*)(addr), (data), 0)
-// Note that for autconfig substitution to properly occur the argument list
-// must not be present in this file -- it should only be in the appropriate
-// AC_DEFINE statement
-#define PAL_PTRACE(cmd, pid, addr, data) ptrace((cmd), (pid), (void*)(addr), (data))
-
-// Define as the ptrace cmd value to attach to a process
-#define PAL_PT_ATTACH PTRACE_ATTACH
-
-// Define as the ptrace cmd value to detach from a process
-#define PAL_PT_DETACH PTRACE_DETACH
-
-// Define as the ptrace cmd value to read a word from a process's data space
-#define PAL_PT_READ_D PTRACE_PEEKDATA
-
-// Define as the ptrace cmd value to write a word to a process's data space
-#define PAL_PT_WRITE_D PTRACE_POKEDATA
-
-// Define as 1 if ISO locale names needs to be in lowercase
-#define HAVE_LOWERCASE_ISO_NAME 0
-
-// Define as 1 if ISO locale names need an underscore after
-// the "ISO" in the name.
-#define HAVE_UNDERSCORE_ISO_NAME 0
-
-// Define as 1 if we have per-thread locales as defined in xlocale.h
-#define HAVE_XLOCALE 0
-
-// Define as 1 if ungetc dose not return EOF on write-only file
-#define UNGETC_NOT_RETURN_EOF 1
-
-// Define as 1 if malloc(0) returns null
-#define MALLOC_ZERO_RETURNS_NULL 0
-
-// Define as 1 if error function for glob takes specific parameters
-#define ERROR_FUNC_FOR_GLOB_HAS_FIXED_PARAMS 1
-
-// Define the ja_JP locale name
-#define JA_JP_LOCALE_NAME "ja_JP_LOCALE_NOT_FOUND"
-
-// Define the ko_KR locale name
-#define KO_KR_LOCALE_NAME "ko_KR_LOCALE_NOT_FOUND"
-
-// Define the zh_TW locale name
-#define ZH_TW_LOCALE_NAME "zh_TW_LOCALE_NOT_FOUND"
-
-// Define as 1 if thread suspension uses signals
-#define USE_SIGNALS_FOR_THREAD_SUSPENSION 1
-
-// Define as 1 if platform has POSIX semaphores
-#define HAS_POSIX_SEMAPHORES 1
-
-// Define as 1 if suspending a thread while blocked on a lock can cause a hang
-#define DEADLOCK_WHEN_THREAD_IS_SUSPENDED_WHILE_BLOCKED_ON_MUTEX 0
-
-// Define as 1 if sigwait cannot take a full sigset as a valid parameter
-#define SIGWAIT_FAILS_WHEN_PASSED_FULL_SIGSET 0
-
-// Define as 1 if a thread cannot suspend itself using the native suspension function
-#define SELF_SUSPEND_FAILS_WITH_NATIVE_SUSPENSION 0
-
-// Define as 1 if netdb.h defines MAXHOSTNAMELEN
-#define NETDB_DEFINES_MAXHOSTNAMELEN 0
-
-// Define as 1 if sys/param.h defines MAXHOSTNAMELEN
-#define SYS_PARAM_DEFINES_MAXHOSTNAMELEN 0
-
-// Define as 1 if getpwuid_r sets errno to ERANGE instead of returning ERANGE error
-#define GETPWUID_R_SETS_ERRNO 1
-
-// Define as 1 in order to use pipes as native support for thread blocking in the
-// Synchronization Manager
-#define SYNCHMGR_PIPE_BASED_THREAD_BLOCKING 0
-
-// Define as 1 in order to signal conditions from a thread suspension safe area
-#define SYNCHMGR_SUSPENSION_SAFE_CONDITION_SIGNALING 1
-
-// Define as 1 if C-runtime file functions (e.g. fwrite) use the ferror()
-// value set by a previous file operation.
-#define FILE_OPS_CHECK_FERROR_OF_PREVIOUS_CALL 0
-
-// Define as 1 if platform has SYSV semaphores
-#define HAS_SYSV_SEMAPHORES 1
-
-// Define as 1 if platform has pthread mutexes
-#define HAS_PTHREAD_MUTEXES 1
-
-// Define as 1 if using stack protection, but need implementation
-#define NEED_STACK_PROTECTOR_IMPL 0
-
-#endif // _PAL_CONFIG_H_INCLUDED
-
-
+#if defined(__APPLE__)
+#include "config.h.osx"
+#else
+#include "config.h.linux"
+#endif
diff --git a/src/pal/src/config.h.linux b/src/pal/src/config.h.linux
new file mode 100644
index 0000000000..90ba8356ed
--- /dev/null
+++ b/src/pal/src/config.h.linux
@@ -0,0 +1,531 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+/* config.h. Generated from config.h.in by configure. */
+/*++
+
+
+
+Module Name:
+
+ include/pal/config.h.in
+
+ process this file with configure to create the PAL's configuration header
+
+--*/
+
+#ifndef _PAL_CONFIG_H_INCLUDED
+#define _PAL_CONFIG_H_INCLUDED 1
+
+/*++
+_NO_DEBUG_MESSAGES_ : configure option --disable-dbgmsg
+
+This turns off compilation of TRACE, WARN, ERROR and ENTRY debug messages
+--*/
+
+#define _NO_DEBUG_MESSAGES_ 0
+
+
+/*++
+CHECK_TRACE_SPECIFIERS : configure option --enable-tracechecks
+
+Ask gcc to check the format specifiers used in trace macros. Not on by default,
+because gcc will complain about %I64d and %S
+--*/
+
+#define CHECK_TRACE_SPECIFIERS 0
+
+/* Define as 1 if you have wchar.h. */
+#define HAVE_WCHAR_H 1
+
+/* Define as 1 if you have ieeefp.h. */
+#define HAVE_IEEEFP_H 0
+
+/* Define as 1 if you have alloca.h. */
+#define HAVE_ALLOCA_H 1
+
+/* Define as 1 if you have stdint.h. */
+#define HAVE_STDINT_H 1
+
+/* Define as 1 if you have netdb.h. */
+#define HAVE_NETDB_H 1
+
+/* Define as 1 if you have inttypes.h. */
+#define HAVE_INTTYPES_H 1
+
+/* Define as 1 if you have stropts.h. */
+#define HAVE_STROPTS_H 1
+
+/* Define as 1 if you have sys/vmparam.h. */
+#define HAVE_SYS_VMPARAM_H 0
+
+/* Define as 1 if you have mach/vm_types.h. */
+#define HAVE_MACH_VM_TYPES_H 0
+
+/* Define as 1 if you have mach/vm_param.h. */
+#define HAVE_MACH_VM_PARAM_H 0
+
+/* Define as 1 if you have sys/param.h. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define as 1 if you have sys/filio.h. */
+#define HAVE_SYS_FILIO_H 0
+
+/* Define as 1 if you have sys/sockio.h. */
+#define HAVE_SYS_SOCKIO_H 0
+
+/* Define as 1 if you have procfs.h. */
+#define HAVE_PROCFS_H 0
+
+/* Define as 1 if you have sys/event.h. */
+#define HAVE_KQUEUE 0
+
+// Define as 1 if you are using dylibs and need dlcompat.
+#define NEED_DLCOMPAT 0
+
+/* Define as 1 if you have crt_externs.h. */
+#define HAVE_CRT_EXTERNS_H 0
+
+// Define as 1 if you have sys/time.h.
+#define HAVE_SYS_TIME_H 1
+
+/* Define as 1 if you have pthread_np.h */
+#define HAVE_PTHREAD_NP_H 0
+
+/* Define as 1 if you have sys/lwp.h */
+#define HAVE_SYS_LWP_H 0
+
+/* Define as 1 if you have towlower. */
+#define HAVE_TOWLOWER 0
+
+/* Define as 1 if struct stat contains st_atimespec, etc. */
+#define HAVE_STAT_TIMESPEC 0
+
+/* Define as 1 if struct stat contains st_atimensec, etc. */
+#define HAVE_STAT_NSEC 0
+
+/* Define as 1 if struct sockaddr contains sa_len. */
+#define HAVE_SOCKADDR_SA_LEN 0
+
+/* Define as 1 if getpwuid_r function exists. */
+#define HAVE_GETPWUID_R 1
+
+/* Define as 1 if you have extern char *tzname. */
+#define HAVE_TZNAME 1
+
+/* Define as 1 if you have extern long int timezone. */
+#define HAVE_TIMEZONE_VAR 0
+
+/* Define as 1 if struct tm has tm_gmtoff. */
+#define HAVE_TM_GMTOFF 1
+
+// Define as 1 if the BSD struct reg is supported.
+#define HAVE_BSD_REGS_T 0
+
+// Define as 1 if ptrace's struct pt_regs is supported.
+#define HAVE_PT_REGS 1
+
+// Define as 1 if mcontext_t contains a gregset_t.
+#define HAVE_GREGSET_T 1
+
+// Define as 1 if realpath() does not require that the last path component
+// be a file.
+#define REALPATH_SUPPORTS_NONEXISTENT_FILES 0
+
+// Define as 1 if sscanf supports the "%ll" format.
+#define SSCANF_SUPPORT_ll 0
+
+// Define as 1 if sscanf has trouble parsing a float from
+// something like "12.34e" (e.g. AIX)
+#define SSCANF_CANNOT_HANDLE_MISSING_EXPONENT 0
+
+// Define as 1 if snprintf works correctly for large values of n.
+#define HAVE_LARGE_SNPRINTF_SUPPORT 1
+
+/* Define as 1 if select() on a fifo that has not had any data
+ written to it returns that data is available for reading. */
+#define HAVE_BROKEN_FIFO_SELECT 0
+
+/* Define as 1 if kevent() on a fifo returns EV_ERROR. */
+#define HAVE_BROKEN_FIFO_KEVENT 1
+
+// Define as 1 if ftruncate correctly returns failure on large lengths.
+#define HAVE_FTRUNCATE_LARGE_LENGTH_SUPPORT 0
+
+// Define as 1 if ftruncate returns failure but extends the file anyway.
+#define HAS_FTRUNCATE_LENGTH_ISSUE 0
+
+/* Define as 1 if SYS_yield is a supported syscall. */
+#define HAVE_YIELD_SYSCALL 0
+
+// Define as 1 if pthreads are Mach threads.
+#define HAVE_MACH_THREADS 0
+
+// Define as 1 if pthreads are Solaris threads.
+#define HAVE_SOLARIS_THREADS 0
+
+// Define as 1 if pthreads has pthread_suspend
+#define HAVE_PTHREAD_SUSPEND 0
+
+// Define as 1 if pthreads has pthread_suspend_np
+#define HAVE_PTHREAD_SUSPEND_NP 0
+
+// Define as 1 if pthreads has pthread_continue
+#define HAVE_PTHREAD_CONTINUE 0
+
+// Define as 1 if pthreads has pthread_resume_np
+#define HAVE_PTHREAD_RESUME_NP 0
+
+// Define as 1 if pthreads has pthread_continue_np
+#define HAVE_PTHREAD_CONTINUE_NP 0
+
+// Define as 1 if mkstemp64 is used instead of mkstemp
+#define MKSTEMP64_IS_USED_INSTEAD_OF_MKSTEMP 0
+
+// Define as 1 if open64 is used instead of open
+#define OPEN64_IS_USED_INSTEAD_OF_OPEN 0
+
+// Define as 1 if pthread has thread_self
+#define HAVE_THREAD_SELF 0
+
+// Define as 1 if pthread has _lwp_self
+#define HAVE__LWP_SELF 0
+
+// Define as 1 if sched_get_priority_[min|max] is supported
+#define HAVE_SCHED_GET_PRIORITY 1
+
+// Define as the hardcoded min and max thread priority (for platforms where
+// sched_get_priority_[min|max] does not exist
+#define PAL_THREAD_PRIORITY_MIN 0
+#define PAL_THREAD_PRIORITY_MAX 0
+
+// Define as 1 if pthread_setschedparam requires special privileges
+#define SET_SCHEDPARAM_NEEDS_PRIVS 0
+
+/* Define as 1 if Mach exceptions are supported. */
+#define HAVE_MACH_EXCEPTIONS 0
+
+// Define as 1 if Mach's vm_read and vm_write are supported.
+#define HAVE_VM_READ 0
+
+/* Define as 1 if sigreturn is supported. */
+#define HAVE_SIGRETURN 0
+
+/* Define as 1 if _thread_sys_sigreturn is supported. */
+#define HAVE__THREAD_SYS_SIGRETURN 0
+
+// Define as 1 if setcontext is supported.
+#define HAVE_SETCONTEXT 1
+
+// Define as 1 if getcontext is supported.
+#define HAVE_GETCONTEXT 1
+
+// Define as 1 if copysign is supported.
+#define HAVE_COPYSIGN 1
+
+// Define as 1 if gethrtime (Solaris/HPUX) is supported.
+#define HAVE_GETHRTIME 0
+
+// Define as 1 if read_real_time (AIX) is supported.
+#define HAVE_READ_REAL_TIME 0
+
+// Define as 1 if fsync is supported.
+#define HAVE_FSYNC 1
+
+// Define as 1 if current platform has a working gettimeofday
+#define HAVE_WORKING_GETTIMEOFDAY 1
+
+// Define as 1 if current platform has a working clock_gettime
+#define HAVE_WORKING_CLOCK_GETTIME 1
+
+// Define as 1 if clock_gettime supports CLOCK_MONOTONIC.
+#define HAVE_CLOCK_MONOTONIC 1
+
+/* Define as 1 if futimes is supported. */
+#define HAVE_FUTIMES 1
+
+/* Define as 1 if utimes is supported. */
+#define HAVE_UTIMES 1
+
+/* Define as 1 if sysctl is supported. */
+#define HAVE_SYSCTL 1
+
+/* Define as 1 if sysconf is supported. */
+#define HAVE_SYSCONF 1
+
+/* Define as 1 if strtok_r is supported. */
+#define HAVE_STRTOK_R 1
+
+/* Define as 1 if localtime_r is supported. */
+#define HAVE_LOCALTIME_R 1
+
+/* Define as 1 if ctime_r is supported. */
+#define HAVE_CTIME_R 1
+
+/* Defined as 1 if gmtime_r is supported. */
+#define HAVE_GMTIME_R 1
+
+/* Define as 1 if timegm is supported. */
+#define HAVE_TIMEGM 1
+
+/* Define as 1 if _snwprintf is supported. */
+#define HAVE__SNWPRINTF 0
+
+// Define as 1 if poll is supported.
+#define HAVE_POLL 1
+
+// Define as 1 if INFTIM is defined.
+#define HAVE_INFTIM 0
+
+// Define as 1 if CHAR_BIT is defined
+#define HAVE_CHAR_BIT 0
+
+/* Define as 1 if directio is supported. */
+#define HAVE_DIRECTIO 0
+
+/* Define as 1 if use of directio is disabled,
+ even if HAVE_DIRECTIO is defined. */
+#define DIRECTIO_DISABLED 0
+
+/* Define as 1 if vm_allocate is supported. */
+#define HAVE_VM_ALLOCATE 0
+
+/* Define as 1 if statfs is supported. */
+#define HAVE_STATFS 0
+
+/* Define as 1 if statvfs is supported. */
+#define HAVE_STATVFS 1
+
+/* Define as 1 if statvfs64 prototype is broken. */
+#define STATVFS64_PROTOTYPE_BROKEN 0
+
+/* Define as 1 if siginfo_t is supported. */
+#define HAVE_SIGINFO_T 1
+
+/* Define as 1 if ucontext_t is supported. */
+#define HAVE_UCONTEXT_T 1
+
+/* Defined to sizeof(off_t). */
+#define SIZEOF_OFF_T 8
+
+/* Define as 1 if in_addr_t is supported. */
+#define HAVE_IN_ADDR_T 0
+
+// Define as 1 if caddr_t is supported.
+#define HAVE_CADDR_T 0
+
+/* Define as 1 if socklen_t is supported. */
+#define HAVE_SOCKLEN_T 1
+
+/* Define as 1 if sockaddr_ext is supported. */
+#define HAVE_SOCKADDR_EXT 0
+
+/* Define as 1 if pthread_rwlock_t is supported. */
+#define HAVE_PTHREAD_RWLOCK_T 1
+
+/* Define as 1 if Core Foundation is supported (Darwin/Mac OS X only). */
+#define HAVE_COREFOUNDATION 0
+
+/* Define as 1 if _NSGetEnviron is supported (Darwin/Mac OS X only). */
+#define HAVE__NSGETENVIRON 0
+
+/* Define this if debug channel output should be appended to existing files
+ instead of overwriting */
+/* #undef _PAL_APPEND_DBG_OUTPUT_ */
+
+/* Define as 1 if mmap() can map a file descriptor for /dev/zero */
+#define HAVE_MMAP_DEV_ZERO 1
+
+// Define as 1 if mmap() ignores its hint parameter.
+#define MMAP_IGNORES_HINT 0
+
+// Define as 1 if mmap() ignores its protection parameter when
+// mapping anonymous pages.
+#define MMAP_ANON_IGNORES_PROTECTION 0
+
+// Define as 1 if mmap() allows remapping previously mapped pages
+#define MMAP_DOESNOT_ALLOW_REMAP 0
+
+// Define as 1 if there cannot be more than one shared mapping of a file
+// region per process at the same time
+#define ONE_SHARED_MAPPING_PER_FILEREGION_PER_PROCESS 0
+
+// Define as 1 if pthread_create() modifies errno when it succeeds.
+#define PTHREAD_CREATE_MODIFIES_ERRNO 0
+
+// Define as 1 if sem_init() modifies errno when it succeeds.
+#define SEM_INIT_MODIFIES_ERRNO 0
+
+// Define as 1 if prwatch_t is supported
+#define HAVE_PRWATCH_T 0
+
+// Define as 1 if /proc/<pid>/ctl is supported.
+#define HAVE_PROCFS_CTL 0
+
+// Define as the name of the memory file in /proc/<pid>
+#define PROCFS_MEM_NAME ""
+
+// Define as 1 if including sys/user.h will result in
+// _DEBUG being defined
+#define USER_H_DEFINES_DEBUG 0
+
+// Define as 1 if close(fd) blocks until there is any outstanding
+// syscall using fd (e.g. AIX)
+#define CLOSE_BLOCKS_ON_OUTSTANDING_SYSCALLS 0
+
+// Define as 1 if sendto returns EHOSTUNREACH when sendto'ing using a
+// "to" sockaddr which does not match the socket address family
+// (e.g. AIX)
+#define SENDTO_RETURNS_UNREACH_ON_WRONG_AF 0
+
+// Define as 1 if shutdown fails on connectionless sockets
+// (e.g. AIX)
+#define SHUTDOWN_FAILS_ON_CONNECTIONLESS_SOCKETS 1
+
+// Define as 1 if it is possible to broadcast on a socket regardless of SO_BROADCAST
+// (e.g. Solaris)
+#define BROADCAST_ALLOWED_WITHOUT_SO_BROADCAST 0
+
+// Define as 1 if SO_RCVTIMEO and SO_SNDTIMEO are not supported
+// or are ignored
+#define SO_TIMEO_NOT_SUPPORTED 0
+
+// Define as 1 if write of 0 bytes to the console hangs.
+#define WRITE_0_BYTES_HANGS_TTY 0
+
+// Define as 1 if acos is compatible with Windows.
+#define HAVE_COMPATIBLE_ACOS 1
+
+// Define as 1 if asin is compatible with Windows.
+#define HAVE_COMPATIBLE_ASIN 1
+
+// Define as 1 if pow is compatible with Windows.
+#define HAVE_COMPATIBLE_POW 0
+
+// Define as 1 if pow returns -Inf when given a negative base and a
+// large magnitude odd exponent.
+#define HAVE_VALID_NEGATIVE_INF_POW 1
+
+// Define as 1 if pow returns +Inf when given a negative base and a
+// large magnitude even exponent.
+#define HAVE_VALID_POSITIVE_INF_POW 1
+
+// Define as 1 if atan2 is compatible with Windows.
+#define HAVE_COMPATIBLE_ATAN2 1
+
+// Define as 1 if exp is compatible with Windows.
+#define HAVE_COMPATIBLE_EXP 1
+
+// Define as 1 if log is compatible with Windows.
+#define HAVE_COMPATIBLE_LOG 1
+
+// Define as 1 if log10 is compatible with Windows.
+#define HAVE_COMPATIBLE_LOG10 1
+
+// Define as 1 if ttrace is supported
+#define HAVE_TTRACE 0
+
+// Define as 1 if calling dlopen() on a library which is already
+// opened returns a different handle
+#define RETURNS_NEW_HANDLES_ON_REPEAT_DLOPEN 0
+
+// If 1, SetThreadPriority() will not actually modify the pthread priority
+// for threads which aren't critical or idle
+#define PAL_IGNORE_NORMAL_THREAD_PRIORITY 0
+
+// Define as a macro that correctly calls ptrace for the platform, e.g.:
+// #define PAL_PTRACE(cmd, pid, addr, data) ptrace((cmd), (pid), (void*)(addr), (data), 0)
+// Note that for autconfig substitution to properly occur the argument list
+// must not be present in this file -- it should only be in the appropriate
+// AC_DEFINE statement
+#define PAL_PTRACE(cmd, pid, addr, data) ptrace((cmd), (pid), (void*)(addr), (data))
+
+// Define as the ptrace cmd value to attach to a process
+#define PAL_PT_ATTACH PTRACE_ATTACH
+
+// Define as the ptrace cmd value to detach from a process
+#define PAL_PT_DETACH PTRACE_DETACH
+
+// Define as the ptrace cmd value to read a word from a process's data space
+#define PAL_PT_READ_D PTRACE_PEEKDATA
+
+// Define as the ptrace cmd value to write a word to a process's data space
+#define PAL_PT_WRITE_D PTRACE_POKEDATA
+
+// Define as 1 if ISO locale names needs to be in lowercase
+#define HAVE_LOWERCASE_ISO_NAME 0
+
+// Define as 1 if ISO locale names need an underscore after
+// the "ISO" in the name.
+#define HAVE_UNDERSCORE_ISO_NAME 0
+
+// Define as 1 if we have per-thread locales as defined in xlocale.h
+#define HAVE_XLOCALE 0
+
+// Define as 1 if ungetc dose not return EOF on write-only file
+#define UNGETC_NOT_RETURN_EOF 1
+
+// Define as 1 if malloc(0) returns null
+#define MALLOC_ZERO_RETURNS_NULL 0
+
+// Define as 1 if error function for glob takes specific parameters
+#define ERROR_FUNC_FOR_GLOB_HAS_FIXED_PARAMS 1
+
+// Define the ja_JP locale name
+#define JA_JP_LOCALE_NAME "ja_JP_LOCALE_NOT_FOUND"
+
+// Define the ko_KR locale name
+#define KO_KR_LOCALE_NAME "ko_KR_LOCALE_NOT_FOUND"
+
+// Define the zh_TW locale name
+#define ZH_TW_LOCALE_NAME "zh_TW_LOCALE_NOT_FOUND"
+
+// Define as 1 if thread suspension uses signals
+#define USE_SIGNALS_FOR_THREAD_SUSPENSION 1
+
+// Define as 1 if platform has POSIX semaphores
+#define HAS_POSIX_SEMAPHORES 1
+
+// Define as 1 if suspending a thread while blocked on a lock can cause a hang
+#define DEADLOCK_WHEN_THREAD_IS_SUSPENDED_WHILE_BLOCKED_ON_MUTEX 0
+
+// Define as 1 if sigwait cannot take a full sigset as a valid parameter
+#define SIGWAIT_FAILS_WHEN_PASSED_FULL_SIGSET 0
+
+// Define as 1 if a thread cannot suspend itself using the native suspension function
+#define SELF_SUSPEND_FAILS_WITH_NATIVE_SUSPENSION 0
+
+// Define as 1 if netdb.h defines MAXHOSTNAMELEN
+#define NETDB_DEFINES_MAXHOSTNAMELEN 0
+
+// Define as 1 if sys/param.h defines MAXHOSTNAMELEN
+#define SYS_PARAM_DEFINES_MAXHOSTNAMELEN 0
+
+// Define as 1 if getpwuid_r sets errno to ERANGE instead of returning ERANGE error
+#define GETPWUID_R_SETS_ERRNO 1
+
+// Define as 1 in order to use pipes as native support for thread blocking in the
+// Synchronization Manager
+#define SYNCHMGR_PIPE_BASED_THREAD_BLOCKING 0
+
+// Define as 1 in order to signal conditions from a thread suspension safe area
+#define SYNCHMGR_SUSPENSION_SAFE_CONDITION_SIGNALING 1
+
+// Define as 1 if C-runtime file functions (e.g. fwrite) use the ferror()
+// value set by a previous file operation.
+#define FILE_OPS_CHECK_FERROR_OF_PREVIOUS_CALL 0
+
+// Define as 1 if platform has SYSV semaphores
+#define HAS_SYSV_SEMAPHORES 1
+
+// Define as 1 if platform has pthread mutexes
+#define HAS_PTHREAD_MUTEXES 1
+
+// Define as 1 if using stack protection, but need implementation
+#define NEED_STACK_PROTECTOR_IMPL 0
+
+#endif // _PAL_CONFIG_H_INCLUDED
+
+
diff --git a/src/pal/src/config.h.osx b/src/pal/src/config.h.osx
new file mode 100644
index 0000000000..47203d289a
--- /dev/null
+++ b/src/pal/src/config.h.osx
@@ -0,0 +1,533 @@
+/* config.h. Generated from config.h.in by configure. */
+/*++
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+Module Name:
+
+ include/pal/config.h.in
+
+ process this file with configure to create the PAL's configuration header
+
+--*/
+
+#ifndef _PAL_CONFIG_H_INCLUDED
+#define _PAL_CONFIG_H_INCLUDED 1
+
+/*++
+_DEBUG : configure option --disable-debug
+
+This turns off compilation of debug-only code.
+--*/
+#define _DEBUG 1
+
+/*++
+_NO_DEBUG_MESSAGES_ : configure option --disable-dbgmsg
+
+This turns off compilation of TRACE, WARN, ERROR and ENTRY debug messages
+--*/
+
+#define _NO_DEBUG_MESSAGES_ 0
+
+
+/*++
+CHECK_TRACE_SPECIFIERS : configure option --enable-tracechecks
+
+Ask gcc to check the format specifiers used in trace macros. Not on by default,
+because gcc will complain about %I64d and %S
+--*/
+
+#define CHECK_TRACE_SPECIFIERS 0
+
+/* Define as 1 if you have wchar.h. */
+#define HAVE_WCHAR_H 1
+
+/* Define as 1 if you have ieeefp.h. */
+#define HAVE_IEEEFP_H 0
+
+/* Define as 1 if you have alloca.h. */
+#define HAVE_ALLOCA_H 1
+
+/* Define as 1 if you have stdint.h. */
+#define HAVE_STDINT_H 1
+
+/* Define as 1 if you have netdb.h. */
+#define HAVE_NETDB_H 1
+
+/* Define as 1 if you have inttypes.h. */
+#define HAVE_INTTYPES_H 1
+
+/* Define as 1 if you have stropts.h. */
+#define HAVE_STROPTS_H 0
+
+/* Define as 1 if you have sys/vmparam.h. */
+#define HAVE_SYS_VMPARAM_H 1
+
+/* Define as 1 if you have mach/vm_types.h. */
+#define HAVE_MACH_VM_TYPES_H 1
+
+/* Define as 1 if you have mach/vm_param.h. */
+#define HAVE_MACH_VM_PARAM_H 1
+
+/* Define as 1 if you have sys/param.h. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define as 1 if you have sys/filio.h. */
+#define HAVE_SYS_FILIO_H 1
+
+/* Define as 1 if you have sys/sockio.h. */
+#define HAVE_SYS_SOCKIO_H 1
+
+/* Define as 1 if you have procfs.h. */
+#define HAVE_PROCFS_H 0
+
+/* Define as 1 if you have sys/event.h. */
+#define HAVE_KQUEUE 1
+
+// Define as 1 if you are using dylibs and need dlcompat.
+#define NEED_DLCOMPAT 0
+
+/* Define as 1 if you have crt_externs.h. */
+#define HAVE_CRT_EXTERNS_H 1
+
+// Define as 1 if you have sys/time.h.
+#define HAVE_SYS_TIME_H 1
+
+/* Define as 1 if you have pthread_np.h */
+#define HAVE_PTHREAD_NP_H 0
+
+/* Define as 1 if you have sys/lwp.h */
+#define HAVE_SYS_LWP_H 0
+
+/* Define as 1 if you have towlower. */
+#define HAVE_TOWLOWER 0
+
+/* Define as 1 if struct stat contains st_atimespec, etc. */
+#define HAVE_STAT_TIMESPEC 1
+
+/* Define as 1 if struct stat contains st_atimensec, etc. */
+#define HAVE_STAT_NSEC 0
+
+/* Define as 1 if struct sockaddr contains sa_len. */
+#define HAVE_SOCKADDR_SA_LEN 1
+
+/* Define as 1 if getpwuid_r function exists. */
+#define HAVE_GETPWUID_R 1
+
+/* Define as 1 if you have extern char *tzname. */
+#define HAVE_TZNAME 1
+
+/* Define as 1 if you have extern long int timezone. */
+#define HAVE_TIMEZONE_VAR 0
+
+/* Define as 1 if struct tm has tm_gmtoff. */
+#define HAVE_TM_GMTOFF 1
+
+// Define as 1 if the BSD struct reg is supported.
+#define HAVE_BSD_REGS_T 0
+
+// Define as 1 if ptrace's struct pt_regs is supported.
+#define HAVE_PT_REGS 0
+
+// Define as 1 if mcontext_t contains a gregset_t.
+#define HAVE_GREGSET_T 0
+
+// Define as 1 if realpath() does not require that the last path component
+// be a file.
+#define REALPATH_SUPPORTS_NONEXISTENT_FILES 0
+
+// Define as 1 if sscanf supports the "%ll" format.
+#define SSCANF_SUPPORT_ll 0
+
+// Define as 1 if sscanf has trouble parsing a float from
+// something like "12.34e" (e.g. AIX)
+#define SSCANF_CANNOT_HANDLE_MISSING_EXPONENT 0
+
+// Define as 1 if snprintf works correctly for large values of n.
+#define HAVE_LARGE_SNPRINTF_SUPPORT 0
+
+/* Define as 1 if select() on a fifo that has not had any data
+ written to it returns that data is available for reading. */
+#define HAVE_BROKEN_FIFO_SELECT 0
+
+/* Define as 1 if kevent() on a fifo returns EV_ERROR. */
+#define HAVE_BROKEN_FIFO_KEVENT 0
+
+// Define as 1 if ftruncate correctly returns failure on large lengths.
+#define HAVE_FTRUNCATE_LARGE_LENGTH_SUPPORT 1
+
+// Define as 1 if ftruncate returns failure but extends the file anyway.
+#define HAS_FTRUNCATE_LENGTH_BUG 1
+
+/* Define as 1 if SYS_yield is a supported syscall. */
+#define HAVE_YIELD_SYSCALL 0
+
+// Define as 1 if pthreads are Mach threads.
+#define HAVE_MACH_THREADS 1
+
+// Define as 1 if pthreads are Solaris threads.
+#define HAVE_SOLARIS_THREADS 0
+
+// Define as 1 if pthreads has pthread_suspend
+#define HAVE_PTHREAD_SUSPEND 0
+
+// Define as 1 if pthreads has pthread_suspend_np
+#define HAVE_PTHREAD_SUSPEND_NP 0
+
+// Define as 1 if pthreads has pthread_continue
+#define HAVE_PTHREAD_CONTINUE 0
+
+// Define as 1 if pthreads has pthread_resume_np
+#define HAVE_PTHREAD_RESUME_NP 0
+
+// Define as 1 if pthreads has pthread_continue_np
+#define HAVE_PTHREAD_CONTINUE_NP 0
+
+// Define as 1 if mkstemp64 is used instead of mkstemp
+#define MKSTEMP64_IS_USED_INSTEAD_OF_MKSTEMP 0
+
+// Define as 1 if open64 is used instead of open
+#define OPEN64_IS_USED_INSTEAD_OF_OPEN 0
+
+// Define as 1 if pthread has thread_self
+#define HAVE_THREAD_SELF 0
+
+// Define as 1 if pthread has _lwp_self
+#define HAVE__LWP_SELF 0
+
+// Define as 1 if sched_get_priority_[min|max] is supported
+#define HAVE_SCHED_GET_PRIORITY 1
+
+// Define as the hardcoded min and max thread priority (for platforms where
+// sched_get_priority_[min|max] does not exist
+#define PAL_THREAD_PRIORITY_MIN 0
+#define PAL_THREAD_PRIORITY_MAX 0
+
+// Define as 1 if pthread_setschedparam requires special privileges
+#define SET_SCHEDPARAM_NEEDS_PRIVS 0
+
+/* Define as 1 if Mach exceptions are supported. */
+#define HAVE_MACH_EXCEPTIONS 1
+
+// Define as 1 if Mach's vm_read and vm_write are supported.
+#define HAVE_VM_READ 1
+
+/* Define as 1 if sigreturn is supported. */
+#define HAVE_SIGRETURN 0
+
+/* Define as 1 if _thread_sys_sigreturn is supported. */
+#define HAVE__THREAD_SYS_SIGRETURN 0
+
+// Define as 1 if setcontext is supported.
+#define HAVE_SETCONTEXT 1
+
+// Define as 1 if getcontext is supported.
+#define HAVE_GETCONTEXT 1
+
+// Define as 1 if copysign is supported.
+#define HAVE_COPYSIGN 1
+
+// Define as 1 if gethrtime (Solaris/HPUX) is supported.
+#define HAVE_GETHRTIME 0
+
+// Define as 1 if read_real_time (AIX) is supported.
+#define HAVE_READ_REAL_TIME 0
+
+// Define as 1 if fsync is supported.
+#define HAVE_FSYNC 1
+
+// Define as 1 if current platform has a working gettimeofday
+#define HAVE_WORKING_GETTIMEOFDAY 1
+
+// Define as 1 if current platform has a working clock_gettime
+#define HAVE_WORKING_CLOCK_GETTIME 0
+
+// Define as 1 if clock_gettime supports CLOCK_MONOTONIC.
+#define HAVE_CLOCK_MONOTONIC 0
+
+/* Define as 1 if futimes is supported. */
+#define HAVE_FUTIMES 1
+
+/* Define as 1 if utimes is supported. */
+#define HAVE_UTIMES 1
+
+/* Define as 1 if sysctl is supported. */
+#define HAVE_SYSCTL 1
+
+/* Define as 1 if sysconf is supported. */
+#define HAVE_SYSCONF 0
+
+/* Define as 1 if strtok_r is supported. */
+#define HAVE_STRTOK_R 1
+
+/* Define as 1 if localtime_r is supported. */
+#define HAVE_LOCALTIME_R 1
+
+/* Define as 1 if ctime_r is supported. */
+#define HAVE_CTIME_R 1
+
+/* Defined as 1 if gmtime_r is supported. */
+#define HAVE_GMTIME_R 1
+
+/* Define as 1 if timegm is supported. */
+#define HAVE_TIMEGM 1
+
+/* Define as 1 if _snwprintf is supported. */
+#define HAVE__SNWPRINTF 0
+
+// Define as 1 if poll is supported.
+#define HAVE_POLL 1
+
+// Define as 1 if INFTIM is defined.
+#define HAVE_INFTIM 0
+
+// Define as 1 if CHAR_BIT is defined
+#define HAVE_CHAR_BIT 0
+
+/* Define as 1 if directio is supported. */
+#define HAVE_DIRECTIO 0
+
+/* Define as 1 if use of directio is disabled,
+ even if HAVE_DIRECTIO is defined. */
+#define DIRECTIO_DISABLED 0
+
+/* Define as 1 if vm_allocate is supported. */
+#define HAVE_VM_ALLOCATE 1
+
+/* Define as 1 if statfs is supported. */
+#define HAVE_STATFS 0
+
+/* Define as 1 if statvfs is supported. */
+#define HAVE_STATVFS 1
+
+/* Define as 1 if statvfs64 prototype is broken. */
+#define STATVFS64_PROTOTYPE_BROKEN 0
+
+/* Define as 1 if siginfo_t is supported. */
+#define HAVE_SIGINFO_T 1
+
+/* Define as 1 if ucontext_t is supported. */
+#define HAVE_UCONTEXT_T 0
+
+/* Defined to sizeof(off_t). */
+#define SIZEOF_OFF_T 8
+
+/* Define as 1 if in_addr_t is supported. */
+#define HAVE_IN_ADDR_T 1
+
+// Define as 1 if caddr_t is supported.
+#define HAVE_CADDR_T 0
+
+/* Define as 1 if socklen_t is supported. */
+#define HAVE_SOCKLEN_T 1
+
+/* Define as 1 if sockaddr_ext is supported. */
+#define HAVE_SOCKADDR_EXT 0
+
+/* Define as 1 if pthread_rwlock_t is supported. */
+#define HAVE_PTHREAD_RWLOCK_T 1
+
+/* Define as 1 if Core Foundation is supported (Darwin/Mac OS X only). */
+#define HAVE_COREFOUNDATION 1
+
+/* Define as 1 if _NSGetEnviron is supported (Darwin/Mac OS X only). */
+#define HAVE__NSGETENVIRON 1
+
+/* Define this if debug channel output should be appended to existing files
+ instead of overwriting */
+/* #undef _PAL_APPEND_DBG_OUTPUT_ */
+
+/* Define as 1 if mmap() can map a file descriptor for /dev/zero */
+#define HAVE_MMAP_DEV_ZERO 0
+
+// Define as 1 if mmap() ignores its hint parameter.
+#define MMAP_IGNORES_HINT 0
+
+// Define as 1 if mmap() ignores its protection parameter when
+// mapping anonymous pages.
+#define MMAP_ANON_IGNORES_PROTECTION 0
+
+// Define as 1 if mmap() allows remapping previously mapped pages
+#define MMAP_DOESNOT_ALLOW_REMAP 0
+
+// Define as 1 if there cannot be more than one shared mapping of a file
+// region per process at the same time
+#define ONE_SHARED_MAPPING_PER_FILEREGION_PER_PROCESS 0
+
+// Define as 1 if pthread_create() modifies errno when it succeeds.
+#define PTHREAD_CREATE_MODIFIES_ERRNO 0
+
+// Define as 1 if sem_init() modifies errno when it succeeds.
+#define SEM_INIT_MODIFIES_ERRNO 0
+
+// Define as 1 if prwatch_t is supported
+#define HAVE_PRWATCH_T 0
+
+// Define as 1 if /proc/<pid>/ctl is supported.
+#define HAVE_PROCFS_CTL 0
+
+// Define as the name of the memory file in /proc/<pid>
+#define PROCFS_MEM_NAME ""
+
+// Define as 1 if including sys/user.h will result in
+// _DEBUG being defined
+#define USER_H_DEFINES_DEBUG 0
+
+// Define as 1 if close(fd) blocks until there is any outstanding
+// syscall using fd (e.g. AIX)
+#define CLOSE_BLOCKS_ON_OUTSTANDING_SYSCALLS 0
+
+// Define as 1 if sendto returns EHOSTUNREACH when sendto'ing using a
+// "to" sockaddr which does not match the socket address family
+// (e.g. AIX)
+#define SENDTO_RETURNS_UNREACH_ON_WRONG_AF 0
+
+// Define as 1 if shutdown fails on connectionless sockets
+// (e.g. AIX)
+#define SHUTDOWN_FAILS_ON_CONNECTIONLESS_SOCKETS 1
+
+// Define as 1 if it is possible to broadcast on a socket regardless of SO_BROADCAST
+// (e.g. Solaris)
+#define BROADCAST_ALLOWED_WITHOUT_SO_BROADCAST 0
+
+// Define as 1 if SO_RCVTIMEO and SO_SNDTIMEO are not supported
+// or are ignored
+#define SO_TIMEO_NOT_SUPPORTED 0
+
+// Define as 1 if write of 0 bytes to the console hangs.
+#define WRITE_0_BYTES_HANGS_TTY 0
+
+// Define as 1 if acos is compatible with Windows.
+#define HAVE_COMPATIBLE_ACOS 1
+
+// Define as 1 if asin is compatible with Windows.
+#define HAVE_COMPATIBLE_ASIN 1
+
+// Define as 1 if pow is compatible with Windows.
+#define HAVE_COMPATIBLE_POW 0
+
+// Define as 1 if pow returns -Inf when given a negative base and a
+// large magnitude odd exponent.
+#define HAVE_VALID_NEGATIVE_INF_POW 1
+
+// Define as 1 if pow returns +Inf when given a negative base and a
+// large magnitude even exponent.
+#define HAVE_VALID_POSITIVE_INF_POW 1
+
+// Define as 1 if atan2 is compatible with Windows.
+#define HAVE_COMPATIBLE_ATAN2 1
+
+// Define as 1 if exp is compatible with Windows.
+#define HAVE_COMPATIBLE_EXP 1
+
+// Define as 1 if log is compatible with Windows.
+#define HAVE_COMPATIBLE_LOG 1
+
+// Define as 1 if log10 is compatible with Windows.
+#define HAVE_COMPATIBLE_LOG10 1
+
+// Define as 1 if ttrace is supported
+#define HAVE_TTRACE 0
+
+// Define as 1 if calling dlopen() on a library which is already
+// opened returns a different handle
+#define RETURNS_NEW_HANDLES_ON_REPEAT_DLOPEN 0
+
+// If 1, SetThreadPriority() will not actually modify the pthread priority
+// for threads which aren't critical or idle
+#define PAL_IGNORE_NORMAL_THREAD_PRIORITY 0
+
+// Define as a macro that correctly calls ptrace for the platform, e.g.:
+// #define PAL_PTRACE(cmd, pid, addr, data) ptrace((cmd), (pid), (int*)(addr), (data), 0)
+// Note that for autconfig substitution to properly occur the argument list
+// must not be present in this file -- it should only be in the appropriate
+// AC_DEFINE statement
+#define PAL_PTRACE(cmd, pid, addr, data) ptrace((cmd), (pid), (caddr_t)(addr), (data))
+
+// Define as the ptrace cmd value to attach to a process
+#define PAL_PT_ATTACH PT_ATTACH
+
+// Define as the ptrace cmd value to detach from a process
+#define PAL_PT_DETACH PT_DETACH
+
+// Define as the ptrace cmd value to read a word from a process's data space
+#define PAL_PT_READ_D PT_READ_D
+
+// Define as the ptrace cmd value to write a word to a process's data space
+#define PAL_PT_WRITE_D PT_WRITE_D
+
+// Define as 1 if ISO locale names needs to be in lowercase
+#define HAVE_LOWERCASE_ISO_NAME 0
+
+// Define as 1 if ISO locale names need an underscore after
+// the "ISO" in the name.
+#define HAVE_UNDERSCORE_ISO_NAME 0
+
+// Define as 1 if we have per-thread locales as defined in xlocale.h
+#define HAVE_XLOCALE 1
+
+// Define as 1 if ungetc dose not return EOF on write-only file
+#define UNGETC_NOT_RETURN_EOF 0
+
+// Define as 1 if malloc(0) returns null
+#define MALLOC_ZERO_RETURNS_NULL 0
+
+// Define as 1 if error function for glob takes specific parameters
+#define ERROR_FUNC_FOR_GLOB_HAS_FIXED_PARAMS 1
+
+// Define the ja_JP locale name
+#define JA_JP_LOCALE_NAME "ja_JP.SJIS"
+
+// Define the ko_KR locale name
+#define KO_KR_LOCALE_NAME "ko_KR.eucKR"
+
+// Define the zh_TW locale name
+#define ZH_TW_LOCALE_NAME "zh_TW.BIG5"
+
+// Define as 1 if thread suspension uses signals
+#define USE_SIGNALS_FOR_THREAD_SUSPENSION 0
+
+// Define as 1 if platform has POSIX semaphores
+#define HAS_POSIX_SEMAPHORES 0
+
+// Define as 1 if suspending a thread while blocked on a lock can cause a hang
+#define DEADLOCK_WHEN_THREAD_IS_SUSPENDED_WHILE_BLOCKED_ON_MUTEX 1
+
+// Define as 1 if sigwait cannot take a full sigset as a valid parameter
+#define SIGWAIT_FAILS_WHEN_PASSED_FULL_SIGSET 0
+
+// Define as 1 if a thread cannot suspend itself using the native suspension function
+#define SELF_SUSPEND_FAILS_WITH_NATIVE_SUSPENSION 0
+
+// Define as 1 if netdb.h defines MAXHOSTNAMELEN
+#define NETDB_DEFINES_MAXHOSTNAMELEN 0
+
+// Define as 1 if sys/param.h defines MAXHOSTNAMELEN
+#define SYS_PARAM_DEFINES_MAXHOSTNAMELEN 0
+
+// Define as 1 if getpwuid_r sets errno to ERANGE instead of returning ERANGE error
+#define GETPWUID_R_SETS_ERRNO 0
+
+// Define as 1 in order to use pipes as native support for thread blocking in the
+// Synchronization Manager
+#define SYNCHMGR_PIPE_BASED_THREAD_BLOCKING 0
+
+// Define as 1 in order to signal conditions from a thread suspension safe area
+#define SYNCHMGR_SUSPENSION_SAFE_CONDITION_SIGNALING 1
+
+// Define as 1 if C-runtime file functions (e.g. fwrite) use the ferror()
+// value set by a previous file operation.
+#define FILE_OPS_CHECK_FERROR_OF_PREVIOUS_CALL 0
+
+// Define as 1 if platform has SYSV semaphores
+#define HAS_SYSV_SEMAPHORES 1
+
+// Define as 1 if platform has pthread mutexes
+#define HAS_PTHREAD_MUTEXES 1
+
+// Define as 1 if using stack protection, but need implementation
+#define NEED_STACK_PROTECTOR_IMPL 1
+
+#endif // _PAL_CONFIG_H_INCLUDED
+
+
diff --git a/src/pal/src/cruntime/path.cpp b/src/pal/src/cruntime/path.cpp
index 4cae89ddd2..1d7fffab9c 100644
--- a/src/pal/src/cruntime/path.cpp
+++ b/src/pal/src/cruntime/path.cpp
@@ -547,13 +547,6 @@ _fullpath(
goto fullpathExit;
}
- if ('\0' != path_copy[cPathCopy-1])
- {
- TRACE("relPath=%s is larger than %lu characters!\n",
- relPath ? relPath : "NULL", cPathCopy-1);
- goto fullpathExit;
- }
-
FILEDosToUnixPathA(path_copy);
if(NULL == realpath(path_copy, realpath_buf))
diff --git a/src/pal/src/cruntime/wchar.cpp b/src/pal/src/cruntime/wchar.cpp
index 8006386638..83c086c0ec 100644
--- a/src/pal/src/cruntime/wchar.cpp
+++ b/src/pal/src/cruntime/wchar.cpp
@@ -36,6 +36,7 @@ Abstract:
#if HAVE_COREFOUNDATION
#define CF_EXCLUDE_CSTD_HEADERS
#include <CoreFoundation/CoreFoundation.h>
+#include <wctype.h>
#else
#include <wctype.h>
#endif
@@ -779,7 +780,7 @@ PAL_towlower( wchar_16 c )
kCFAllocatorDefault, 1);
if (cfString != NULL)
{
- CFStringAppendCharacters(cfString, &c, 1);
+ CFStringAppendCharacters(cfString, (const UniChar*)&c, 1);
CFStringLowercase(cfString, NULL);
c = CFStringGetCharacterAtIndex(cfString, 0);
CFRelease(cfString);
@@ -838,7 +839,7 @@ PAL_towupper( wchar_16 c )
kCFAllocatorDefault, 1);
if (cfString != NULL)
{
- CFStringAppendCharacters(cfString, &c, 1);
+ CFStringAppendCharacters(cfString, (const UniChar*)&c, 1);
CFStringUppercase(cfString, NULL);
c = CFStringGetCharacterAtIndex(cfString, 0);
CFRelease(cfString);
diff --git a/src/pal/src/examples/CMakeLists.txt b/src/pal/src/examples/CMakeLists.txt
index 7f01f4523e..7d0450dcf3 100644
--- a/src/pal/src/examples/CMakeLists.txt
+++ b/src/pal/src/examples/CMakeLists.txt
@@ -14,7 +14,5 @@ add_executable(palexmpl
add_dependencies(palexmpl CoreClrPal)
target_link_libraries(palexmpl
- pthread
- rt
CoreClrPal
)
diff --git a/src/pal/src/exception/machexception.cpp b/src/pal/src/exception/machexception.cpp
index 5bf4074a76..f42840def0 100644
--- a/src/pal/src/exception/machexception.cpp
+++ b/src/pal/src/exception/machexception.cpp
@@ -41,7 +41,9 @@ Abstract:
#include <string.h>
#include <unistd.h>
#include <pthread.h>
+#if defined(__powerpc__)
#include <architecture/ppc/cframe.h>
+#endif
#include <dlfcn.h>
#include <mach-o/loader.h>
diff --git a/src/pal/src/exception/machmessage.cpp b/src/pal/src/exception/machmessage.cpp
index eca953c222..f1b4388d6c 100644
--- a/src/pal/src/exception/machmessage.cpp
+++ b/src/pal/src/exception/machmessage.cpp
@@ -1137,7 +1137,7 @@ thread_act_t MachMessage::GetThreadFromState(thread_state_flavor_t eFlavor, thre
// Transform a exception handler behavior type into the corresponding Mach message ID for the notification.
mach_msg_id_t MachMessage::MapBehaviorToNotificationType(exception_behavior_t eBehavior)
{
- switch (eBehavior)
+ switch ((uint)eBehavior)
{
case EXCEPTION_DEFAULT:
return EXCEPTION_RAISE_MESSAGE_ID;
diff --git a/src/pal/src/exception/machmessage.h b/src/pal/src/exception/machmessage.h
index 00b37c18ff..8225852507 100644
--- a/src/pal/src/exception/machmessage.h
+++ b/src/pal/src/exception/machmessage.h
@@ -53,7 +53,7 @@ typedef mach_exception_data_type_t mach_exception_subcode_t;
#define NONPAL_TRACE(_format, ...)
#endif // _DEBUG
-struct CorUnix::MachExceptionHandler;
+struct MachExceptionHandler;
// Abstraction of a subset of Mach message types. Provides accessors that hide the subtle differences in the
// message layout of similar message types.
@@ -318,7 +318,7 @@ private:
exception_raise_state_reply_64_t raise_state_reply_64;
exception_raise_state_identity_reply_64_t raise_state_identity_reply_64;
} data;
- };
+ } __attribute__((packed));;
// Re-initializes this data structure (to the same state as default construction, containing no message).
void ResetMessage();
diff --git a/src/pal/src/file/file.cpp b/src/pal/src/file/file.cpp
index 976266ec71..69a9cffb19 100644
--- a/src/pal/src/file/file.cpp
+++ b/src/pal/src/file/file.cpp
@@ -1174,12 +1174,24 @@ DeleteFileA(
dwLastError = FILEGetLastErrorFromErrnoAndFilename(lpUnixFileName);
goto done;
}
+
+ lpFullUnixFileName = reinterpret_cast<LPSTR>(InternalMalloc(pThread, cchFullUnixFileName));
+ if ( lpFullUnixFileName == NULL )
+ {
+ ERROR("InternalMalloc() failed\n");
+ palError = ERROR_NOT_ENOUGH_MEMORY;
+ goto done;
+ }
+
+ // Initialize the path to zeroes...
+ ZeroMemory(lpFullUnixFileName, cchFullUnixFileName);
// Compute the absolute pathname to the file. This pathname is used
// to determine if two file names represent the same file.
palError = InternalCanonicalizeRealPath(pThread, lpUnixFileName, lpFullUnixFileName, cchFullUnixFileName);
if (palError != NO_ERROR)
{
+ InternalFree(pThread, lpFullUnixFileName);
lpFullUnixFileName = InternalStrdup(pThread, lpUnixFileName);
if (!lpFullUnixFileName)
{
diff --git a/src/pal/src/loader/module.cpp b/src/pal/src/loader/module.cpp
index b7074b4c7d..32f32d63e2 100644
--- a/src/pal/src/loader/module.cpp
+++ b/src/pal/src/loader/module.cpp
@@ -56,7 +56,9 @@ Abstract:
#include <sys/types.h>
#include <sys/mman.h>
+#if !defined(__APPLE__)
#include <gnu/lib-names.h>
+#endif
using namespace CorUnix;
@@ -94,13 +96,6 @@ PDLLMAIN g_pRuntimeDllMain = NULL;
// linked into some utility.
extern char g_szCoreCLRPath[MAX_PATH];
-#if defined(CORECLR) && defined(__APPLE__)
-// Under CoreCLR/Mac the pal_module above actually represents the PAL, the PALRT and mscorwks (they're all
-// linked into one binary). The PAL has no DllMain, but the other two do. Cache their DllMain entrypoints here
-// so we can call them properly (e.g. thread attaches).
-PDLLMAIN g_pPalRTDllMain = NULL;
-#endif // CORECLR && __APPLE__
-
/* static function declarations ***********************************************/
static BOOL LOADValidateModule(MODSTRUCT *module);
@@ -108,9 +103,7 @@ static LPWSTR LOADGetModuleFileName(MODSTRUCT *module);
static HMODULE LOADLoadLibrary(LPCSTR ShortAsciiName, BOOL fDynamic);
static void LOAD_SEH_CallDllMain(MODSTRUCT *module, DWORD dwReason, LPVOID lpReserved);
static MODSTRUCT *LOADAllocModule(void *dl_handle, LPCSTR name);
-#if !defined(CORECLR) || !defined(__APPLE__)
static INT FindLibrary(CHAR* pszRelName, CHAR** ppszFullName);
-#endif // !CORECLR || !__APPLE__
/* API function definitions ***************************************************/
@@ -298,9 +291,7 @@ GetProcAddress(
{
MODSTRUCT *module;
FARPROC ProcAddress = NULL;
-#if !defined(CORECLR) || !defined(__APPLE__)
LPCSTR symbolName = lpProcName;
-#endif // !defined(CORECLR) || !defined(__APPLE__)
PERF_ENTRY(GetProcAddress);
ENTRY("GetProcAddress (hModule=%p, lpProcName=%p (%s))\n",
@@ -341,12 +332,11 @@ GetProcAddress(
// If we're looking for a symbol inside the PAL, we try the PAL_ variant
// first because otherwise we run the risk of having the non-PAL_
// variant preferred over the PAL's implementation.
-#if !defined(CORECLR) || !defined(__APPLE__)
if (module->dl_handle == pal_module.dl_handle)
{
int iLen = 4 + strlen(lpProcName) + 1;
LPSTR lpPALProcName = (LPSTR) alloca(iLen);
-
+
if (strcpy_s(lpPALProcName, iLen, "PAL_") != SAFECRT_SUCCESS)
{
ERROR("strcpy_s failed!\n");
@@ -364,62 +354,12 @@ GetProcAddress(
ProcAddress = (FARPROC) dlsym(module->dl_handle, lpPALProcName);
symbolName = lpPALProcName;
}
-#else // !CORECLR || !__APPLE__
- if (module == &pal_module)
- {
- // Attempting to lookup a symbol exported by the PAL/runtime itself.
-
- // Under CoreCLR/Mac the PAL "module" represents either the entire CoreCLR binary (including PAL,
- // PALRT and mscorwks) or just the PAL in the (uncommon) case of a standalone PAL. We can tell the
- // difference in these cases by whether the sys_module field of pal_module was initialized to contain
- // a non-NULL value: this is only done in the CoreCLR case.
- if (pal_module.sys_module)
- {
- // Trying to locate a symbol in the PAL, PALRT or mscorwks.
- int iLen = 4 + strlen(lpProcName) + 1;
- LPSTR lpPALProcName = (LPSTR) alloca(iLen);
-
- if (strcpy_s(lpPALProcName, iLen, "PAL_") != SAFECRT_SUCCESS)
- {
- ERROR("strcpy_s failed!\n");
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- goto done;
- }
-
- if (strcat_s(lpPALProcName, iLen, lpProcName) != SAFECRT_SUCCESS)
- {
- ERROR("strcat_s failed!\n");
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- goto done;
- }
-
- ProcAddress = (FARPROC)LookupFunctionInCoreCLR(pal_module.sys_module, lpPALProcName);
- }
- else
- {
- // Trying to locate a symbol in the standalone PAL. We don't support this (it's brittle to lump
- // the PAL namespace in with some random host code). Just fall through to the failure case.
- ASSERT("Attempted to lookup proc address in a standalone PAL");
- }
- }
-#endif // !CORECLR || !__APPLE__
// If we aren't looking inside the PAL or we didn't find a PAL_ variant
// inside the PAL, fall back to a normal search.
if (ProcAddress == NULL)
{
-#if defined(CORECLR) && defined(__APPLE__)
- if (module->dl_handle)
- {
-#endif // CORECLR && __APPLE__
ProcAddress = (FARPROC) dlsym(module->dl_handle, lpProcName);
-#if defined(CORECLR) && defined(__APPLE__)
- }
- else if (module->sys_module)
- {
- ProcAddress = (FARPROC)LookupFunctionInCoreCLR(module->sys_module, lpProcName);
- }
-#endif // CORECLR && __APPLE__
}
if (ProcAddress)
@@ -834,7 +774,6 @@ PAL_UnregisterLibraryW(
/* Internal PAL functions *****************************************************/
-#if !defined(CORECLR) || !defined(__APPLE__)
/*++
LOADGetLibRotorPalSoFileName
@@ -909,7 +848,6 @@ Done:
}
return iRetVal;
}
-#endif // !CORECLR || !__APPLE__
/*++
Function :
@@ -931,9 +869,7 @@ Notes :
extern "C"
BOOL LOADInitializeModules(LPWSTR exe_name)
{
-#if !defined(CORECLR) || !defined(__APPLE__)
LPWSTR lpwstr = NULL;
-#endif // !defined(CORECLR) || !defined(__APPLE__)
#if RETURNS_NEW_HANDLES_ON_REPEAT_DLOPEN
LPSTR pszExeName = NULL;
@@ -954,9 +890,6 @@ BOOL LOADInitializeModules(LPWSTR exe_name)
/* initialize module for main executable */
TRACE("Initializing module for main executable\n");
exe_module.self=(HMODULE)&exe_module;
-#if defined(CORECLR) && defined(__APPLE__)
- exe_module.sys_module = NULL;
-#endif // CORECLR && __APPLE__
exe_module.dl_handle=dlopen(NULL, RTLD_LAZY);
if(!exe_module.dl_handle)
{
@@ -973,7 +906,6 @@ BOOL LOADInitializeModules(LPWSTR exe_name)
TRACE("Initializing module for PAL library\n");
pal_module.self=(HANDLE)&pal_module;
-#if !defined(CORECLR) || !defined(__APPLE__)
if (g_szCoreCLRPath[0] == '\0')
{
pal_module.lib_name=NULL;
@@ -1002,63 +934,6 @@ BOOL LOADInitializeModules(LPWSTR exe_name)
#endif
}
}
-#else // !CORECLR || !__APPLE__
- // Under CoreCLR/Mac we have a single binary instead of separate dynamic libraries. Here pal_module
- // represents all of that dylib (with dl_handle == NULL and sys_module != NULL). We still support some
- // scenarios with a standalone PAL statically linked into host code. These cases are differented by
- // sys_module being NULL (and GetProcAddress() will not work on such a module).
- pal_module.lib_name = UTIL_MBToWC_Alloc("CoreCLR", -1);
- if(NULL == pal_module.lib_name)
- {
- ERROR("MBToWC failure, unable to save full name of PAL module\n");
- goto Done;
- }
- pal_module.dl_handle = NULL;
-
- // Determine whether we're part of CoreCLR or a standalone PAL. Do this by looking at the g_szCoreCLRPath
- // global: this is set to a non-zero length string by PAL initialization in the CoreCLR case.
- if (g_szCoreCLRPath[0] != '\0')
- {
- // We're part of a full CoreCLR. Determine our module's handle and cache it for future
- // GetProcAddress() operations).
- pal_module.sys_module = FindCoreCLRHandle();
- if (pal_module.sys_module == NULL)
- {
- ASSERT("FindCoreCLRHandle() failure");
- goto Done;
- }
- }
- else
- {
- // We're just a standalone PAL. Disable any functionality that needs to peek into the containing
- // module (since we know nothing about that module).
- pal_module.sys_module = NULL;
- }
-
- // If we really are running in CoreCLR then we need to locate and remember the DllMain routines for the
- // PalRT and mscorwks (the PAL itself doesn't have one). We use these to keep the components up to date
- // with thread attaches and detaches. We can't call them here for the process attach, however, since we
- // are still partway through PAL initialization. We rely on PAL_InitializeCoreCLR to call us back on
- // LOADInitCoreCLRModules once PAL initialization is complete.
- if (pal_module.sys_module)
- {
- g_pPalRTDllMain = (PDLLMAIN)LookupFunctionInCoreCLR(pal_module.sys_module, "PalRtDllMain");
- if (g_pPalRTDllMain == NULL)
- {
- ERROR("Failed to locate PalRT DllMain\n");
- SetLastError(ERROR_INVALID_DLL);
- goto Done;
- }
-
- g_pRuntimeDllMain = (PDLLMAIN)LookupFunctionInCoreCLR(pal_module.sys_module, "CoreDllMain");
- if (g_pRuntimeDllMain == NULL)
- {
- ERROR("Failed to locate Mscorwks DllMain\n");
- SetLastError(ERROR_INVALID_DLL);
- goto Done;
- }
- }
-#endif // !CORECLR || !__APPLE__
pal_module.refcount=-1;
pal_module.next=&exe_module;
@@ -1241,30 +1116,6 @@ void LOADCallDllMain(DWORD dwReason, LPVOID lpReserved)
LockModuleList();
-#if defined(CORECLR) && defined(__APPLE__)
- // The CoreCLR needs to simulate PalRT and mscorwks being separate libraries rather
- // than a single binary.
- if (InLoadOrder && g_pPalRTDllMain)
- {
-#if !_NO_DEBUG_MESSAGES_
- /* reset ENTRY nesting level back to zero while inside the callback... */
- int old_level;
- old_level = DBG_change_entrylevel(0);
-#endif /* !_NO_DEBUG_MESSAGES_ */
-
- {
- PAL_LeaveHolder holder;
- g_pPalRTDllMain((HMODULE) module, dwReason, lpReserved);
- }
- g_pRuntimeDllMain((HMODULE) module, dwReason, lpReserved);
-
-#if !_NO_DEBUG_MESSAGES_
- /* ...and set nesting level back to what it was */
- DBG_change_entrylevel(old_level);
-#endif /* !_NO_DEBUG_MESSAGES_ */
- }
-#endif // CORECLR && __APPLE__
-
module = &exe_module;
do {
if (!InLoadOrder)
@@ -1298,30 +1149,6 @@ void LOADCallDllMain(DWORD dwReason, LPVOID lpReserved)
module = module->next;
} while (module != &exe_module);
-#if defined(CORECLR) && defined(__APPLE__)
- // The CoreCLR needs to simulate PalRT and CoreCLR being separate libraries rather
- // than a single binary.
- if (!InLoadOrder && g_pPalRTDllMain)
- {
-#if !_NO_DEBUG_MESSAGES_
- /* reset ENTRY nesting level back to zero while inside the callback... */
- int old_level;
- old_level = DBG_change_entrylevel(0);
-#endif /* !_NO_DEBUG_MESSAGES_ */
-
- g_pRuntimeDllMain((HMODULE) module, dwReason, lpReserved);
- {
- PAL_LeaveHolder holder;
- g_pPalRTDllMain((HMODULE) module, dwReason, lpReserved);
- }
-
-#if !_NO_DEBUG_MESSAGES_
- /* ...and set nesting level back to what it was */
- DBG_change_entrylevel(old_level);
-#endif /* !_NO_DEBUG_MESSAGES_ */
- }
-#endif // CORECLR && __APPLE__
-
UnlockModuleList();
}
@@ -1502,9 +1329,6 @@ static MODSTRUCT *LOADAllocModule(void *dl_handle, LPCSTR name)
}
module->dl_handle = dl_handle;
-#if defined(CORECLR) && defined(__APPLE__)
- module->sys_module = NULL;
-#endif // CORECLR && __APPLE__
#if NEED_DLCOMPAT
if (isdylib(module))
{
@@ -1556,7 +1380,11 @@ static HMODULE LOADLoadLibrary(LPCSTR ShortAsciiName, BOOL fDynamic)
// As a result, we have to use the full name (i.e. lib.so.6) that is defined by LIBC_SO.
if (strcmp(ShortAsciiName, LIBC_NAME_WITHOUT_EXTENSION) == 0)
{
+#if defined(__APPLE__)
+ ShortAsciiName = "libc.dylib";
+#else
ShortAsciiName = LIBC_SO;
+#endif
}
LockModuleList();
@@ -1881,7 +1709,6 @@ BOOL PAL_LOADUnloadPEFile(void * ptr)
return retval;
}
-#if !defined(CORECLR) || !defined(__APPLE__)
/*++
Function:
FindLibrary
@@ -2060,7 +1887,6 @@ Done:
// *ppszFullName to NULL.
return iRetVal;
}
-#endif // !CORECLR || !__APPLE__
/*++
LOADInitCoreCLRModules
@@ -2077,483 +1903,9 @@ Return value:
--*/
BOOL LOADInitCoreCLRModules()
{
-#ifdef __APPLE__
- {
- PAL_LeaveHolder holder;
- if (!g_pPalRTDllMain((HMODULE)&pal_module, DLL_PROCESS_ATTACH, NULL))
- return FALSE;
- }
-#endif // __APPLE__
return g_pRuntimeDllMain((HMODULE)&pal_module, DLL_PROCESS_ATTACH, NULL);
}
-#if defined(CORECLR) && defined(__APPLE__)
-// Abstract the API used to load and query for functions in the CoreCLR binary to make it easier to change the
-// underlying implementation.
-
-// Load the CoreCLR module into memory given the directory in which it resides. Returns NULL on failure.
-CORECLRHANDLE LoadCoreCLR(const char *szPath)
-{
- CFStringRef hPath = NULL;
- CFURLRef hUrl = NULL;
- CFBundleRef hBundle = NULL;
-
- // We're handed the full path to the CoreCLR directory but CFBundleCreate wants the path of the bundle
- // directory that contains it. So we have to strip two directory components off.
- int iLen = strlen(szPath) + 1;
- char *szBundlePath = (char*)alloca(iLen);
-
- if (strcpy_s(szBundlePath, iLen, szPath) != SAFECRT_SUCCESS)
- {
- ERROR("strcpy_s failed!\n");
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- goto done;
- }
-
- // Null out the last three slashes:
- // <foo>/CoreCLR.bundle/Contents/MacOS/ -> <foo>/CoreCLR.bundle/Contents/MacOS
- // <foo>/CoreCLR.bundle/Contents/MacOS -> <foo>/CoreCLR.bundle/Contents
- // <foo>/CoreCLR.bundle/Contents -> <foo>/CoreCLR.bundle
- TRACE("LoadCoreCLR: szPath = \"%s\"\n", szPath);
- for (int i = 0; i < 3; i++)
- {
- char *szLastSlash = rindex(szBundlePath, '/');
- if (szLastSlash == NULL)
- {
- ERROR("Got invalid bundle path \"%s\"\n", szPath);
- SetLastError(ERROR_INVALID_PARAMETER);
- goto done;
- }
- *szLastSlash = '\0';
- }
-
- // Convert the pathname provided as a cstring to a CFString.
- hPath = CFStringCreateWithCString(kCFAllocatorDefault, szBundlePath, kCFStringEncodingUTF8);
- if (hPath == NULL)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- goto done;
- }
-
- // Convert the path into a URL.
- hUrl = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, hPath, kCFURLPOSIXPathStyle, TRUE);
- if (hUrl == NULL)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- goto done;
- }
-
- // Load the bundle from the URL.
- hBundle = CFBundleCreate(kCFAllocatorDefault, hUrl);
-
- done:
- if (hUrl)
- CFRelease(hUrl);
- if (hPath)
- CFRelease(hPath);
-
- return hBundle;
-}
-
-// Lookup the named function in the given CoreCLR image. Returns NULL on failure.
-void *LookupFunctionInCoreCLR(CORECLRHANDLE hCoreCLR, const char *szFunction)
-{
- CFStringRef hFunction = NULL;
- void *pFunction = NULL;
-
- // Convert the function name provided as a cstring to a CFString.
- hFunction = CFStringCreateWithCString(kCFAllocatorDefault, szFunction, kCFStringEncodingUTF8);
- if (hFunction == NULL)
- goto done;
-
- // Look up the function name in the bundle.
- {
- // We temporarily leave PAL as a workaround for what is presumably a problem in gdb (as of version 477).
- // The function we call here may call into dyld for linking new images, and gdb sets a breakpoint deep
- // in there so that it knows about it, and can load new symbol files. We leave the PAL so that we
- // unhook the exception port for hardware breakpoints.
- //
- // Strictly speaking, we'd expect this to work without leaving the PAL: For a breakpoint exception, if
- // no managed debugger is attached, our thread-level handler sends back a message to the system that
- // we do not with to handle it. This causes the system to forward the exception message to the task
- // and host-level handlers. However, gdb's host-level handler seems to hang in this case.
- PAL_LeaveHolder holder;
- pFunction = CFBundleGetFunctionPointerForName(hCoreCLR, hFunction);
- }
-
- done:
- if (hFunction)
- CFRelease(hFunction);
-
- return pFunction;
-}
-
-// Locate the CoreCLR module handle associated with the code currently executing. Returns NULL on failure.
-CORECLRHANDLE FindCoreCLRHandle()
-{
- // Return NULL when we're not really part of CoreCLR (i.e. we're a standalone PAL).
- if (g_szCoreCLRPath[0] == '\0')
- {
- SetLastError(ERROR_NOT_SUPPORTED);
- return NULL;
- }
-
- // Reloading the same bundle will just return a reference to the exiting copy and we know the path from
- // which the host originally loaded us.
- return LoadCoreCLR(g_szCoreCLRPath);
-}
-#endif // CORECLR && __APPLE__
-
-/*++
-Function:
- PAL_GetModuleBaseFromAddress
-
- Given an address, returns the base address of the dynamic module which contains that address,
- or NULL if none.
-
- Notes:
- This is a replacement for code that casts HMODULEs to pointers on Windows.
- Ideally this would take an HMODULE instead of an address, but that is harder - we don't seem to
- have a way to map it directly to a dyld index or to get an address from it. Eg., we're not
- guaranteed toh ave a module name, dllMain or dyld handle.
- */
-#ifdef __APPLE__
-PALAPI
-LPCVOID
-PAL_GetModuleBaseFromAddress(LPCVOID pAddress)
-{
- LPCVOID retval = NULL;
-
- PERF_ENTRY(PAL_GetModuleBaseFromAddress);
- ENTRY("PAL_GetModuleBaseFromAddress (pAddress=%p)\n", pAddress);
-
- // Given a pointer into the module, get the header at the start of the module
- retval = _dyld_get_image_header_containing_address(pAddress);
- if (retval == NULL)
- {
- // All modules we load use dyld (even bundles are implemented using this in the OS)
- TRACE("Address isn't recognized as being in a dyld module: %p\n", pAddress);
- goto done;
- }
-
- TRACE("base address of module with address %p is %p\n", pAddress, retval);
-
-done:
- LOGEXIT("PAL_GetModuleBaseFromAddress returns %p\n", retval);
- PERF_EXIT(PAL_GetModuleBaseFromAddress);
- return retval;
-}
-
-//---------------------------------------------------------------------------------------
-//
-// Retrieve the UUID in the image.
-//
-// Arguments:
-// pImageBase - the base address of where an image is loaded into memory
-// pUUID - out parameter; return the UUID in the image
-//
-// Assumptions:
-// The buffer pointed to by pUUID must have at least 16 bytes.
-//
-// Return Value:
-// TRUE if this function successfully retrieves the UUID from the specified image
-//
-
-PALAPI
-BOOL
-PAL_GetUUIDOfImage(LPCVOID pImageBase, BYTE * pUUID)
-{
- PERF_ENTRY(PAL_GetUUIDOfImage);
- ENTRY("PAL_GetUUIDOfImage (pImageBase=%p, pUUID=%p)\n", pImageBase, pUUID);
-
- // There should be a Mach-O header at the image base.
- const mach_header * pHeader;
- pHeader = reinterpret_cast<const mach_header *>(pImageBase);
-
- const load_command * pCurCommand = NULL;
- UINT32 cLoadCommands = 0;
- BOOL fFoundUUID = FALSE;
-
- // The offset to the magic number is the same for both mach_header and for
- // mach_header_64 (same size too), so it's safe to use it to check for
- // MH_MAGIC_64.
- if (pHeader->magic == MH_MAGIC)
- {
- // Immediately following the header are the load commands.
- cLoadCommands = pHeader->ncmds;
- pCurCommand = reinterpret_cast<const load_command *>(pHeader + 1);
-
- }
- else if (pHeader->magic == MH_MAGIC_64)
- {
- const mach_header_64 * pHeader64;
- pHeader64 = reinterpret_cast<const mach_header_64 *>(pImageBase);
- cLoadCommands = pHeader64->ncmds;
- pCurCommand = reinterpret_cast<const load_command *>(pHeader64 + 1);
- }
-
- if (pCurCommand)
- {
- // Loop through the load commmands to find the LC_UUID load command.
- for (UINT32 i = 0; i < cLoadCommands; i++)
- {
- if (pCurCommand->cmd == LC_UUID)
- {
- const uuid_command * pUUIDCommand = reinterpret_cast<const uuid_command *>(pCurCommand);
-
- // sanity check
- if (pUUIDCommand->cmdsize == sizeof(uuid_command))
- {
- // Copy the 16-byte UUID into the out buffer.
- memcpy(pUUID, pUUIDCommand->uuid, sizeof(pUUIDCommand->uuid));
- fFoundUUID = TRUE;
- break;
- }
- }
- pCurCommand = reinterpret_cast<const load_command *>((SIZE_T)pCurCommand + pCurCommand->cmdsize);
- }
- }
-
- LOGEXIT("PAL_GetUUIDOfImage\n");
- PERF_EXIT(PAL_GetUUIDOfImage);
- return fFoundUUID;
-}
-
-//---------------------------------------------------------------------------------------
-// Retrieve the version stored in the Info.plist file in a bundle.
-//
-// Arguments:
-// bundle - Target bundle.
-// pwszVersionString - out parameter; buffer to be filled with the version string
-// cchVersionStringBuffer - size of the buffer in # of characters pointed to by pwszVersionString
-// pcchVersionStringBufferRequired - required size in characters, including NULL.
-//
-// Return Value:
-// Return the number of characters in the version string (excluding NULL) or 0 if the operation fails.
-//
-// Notes:
-// Call GetLastError() to retrieve more information if the function fails.
-//
-static DWORD GetBundleVersionString(IN CFBundleRef bundle,
- IN WCHAR *pwszVersionString,
- IN DWORD cchVersionStringBuffer,
- IN DWORD *pcchVersionStringBufferRequired)
-{
- CFTypeRef hVersionString = NULL;
- CFStringRef hRealVersionString = NULL;
-
- *pcchVersionStringBufferRequired = 0;
-
- // Get a CFTypeRef to the version string stored in the Info.plist file in the CoreCLR bundle.
- // CFTypeRef is like an System.Object. It's the base class in CoreFoundation.
- hVersionString = CFBundleGetValueForInfoDictionaryKey(bundle, kCFBundleVersionKey);
- if (hVersionString == NULL || CFGetTypeID(hVersionString) != CFStringGetTypeID())
- {
- SetLastError(ERROR_INVALID_DATA);
- return 0;
- }
- hRealVersionString = static_cast<CFStringRef>(hVersionString);
-
- // Get the length of the version string.
- S_UINT32 cchRealVersionString(ClrSafeInt<CFIndex>(CFStringGetLength(hRealVersionString)));
- if (cchRealVersionString.IsOverflow() ||
- !cchRealVersionString.addition(cchRealVersionString.Value(), 1ul, *pcchVersionStringBufferRequired))
- {
- SetLastError(ERROR_INVALID_DATA);
- return 0;
- }
-
- if (*pcchVersionStringBufferRequired > cchVersionStringBuffer)
- {
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- return 0;
- }
-
- // Copy the version string into the output buffer and make sure we put the NULL character at the end.
- CFStringGetCharacters(hRealVersionString, CFRangeMake(0, cchRealVersionString.Value()), pwszVersionString);
- pwszVersionString[cchRealVersionString.Value()] = L'\0';
-
- return cchRealVersionString.Value();
-}
-
-//---------------------------------------------------------------------------------------
-//
-// Retrieve the version stored in the Info.plist file in a bundle containing the passed in executable path.
-//
-// Arguments:
-// pwszCoreClrFullPath - full path to CoreCLR
-// pwszVersionString - out parameter; buffer to be filled with the version string
-// cchVersionStringBuffer - size of the buffer in # of characters pointed to by pwszVersionString
-// pcchVersionStringBufferRequired - required size in characters, including NULL.
-//
-// Return Value:
-// Return the number of characters in the version string (excluding NULL) or 0 if the operation fails.
-//
-// Notes:
-// Call GetLastError() to retrieve more information if the function fails.
-//
-
-PALAPI
-DWORD
-PAL_GetVersionString(IN WCHAR * pwszCoreClrFullPath,
- IN OUT WCHAR * pwszVersionString,
- IN DWORD cchVersionStringBuffer,
- OUT DWORD *pcchVersionStringBufferRequired)
-{
- PERF_ENTRY(PAL_GetVersionString);
- ENTRY("PAL_GetVersionString (pwszCoreClrFullPath=%p (%S), pwszVersionString=%p, "
- "cchVersionStringBuffer=%u, pcchVersionStringBufferRequired=%p)\n",
- (pwszCoreClrFullPath ? pwszCoreClrFullPath : W16_NULLSTRING),
- (pwszCoreClrFullPath ? pwszCoreClrFullPath : W16_NULLSTRING),
- pwszVersionString, cchVersionStringBuffer, pcchVersionStringBufferRequired);
-
- // various handles for dealing with the Core Foundation APIs
- CFStringRef hPath = NULL;
- CFURLRef hURL = NULL;
- CFBundleRef hBundle = NULL;
-
- DWORD cchFullPath = PAL_wcslen(pwszCoreClrFullPath);
- DWORD cchVersionString = 0;
-
- // Make sure the full path is not too long.
- if (cchFullPath > MAX_PATH)
- {
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- goto LExit;
- }
-
- // Include an extra space for the NULL character.
- WCHAR wszBundlePath[MAX_PATH + 1];
- if (wcscpy_s(wszBundlePath, cchFullPath + 1, pwszCoreClrFullPath) != SAFECRT_SUCCESS)
- {
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- goto LExit;
- }
-
- // Null out the last three slashes:
- // <foo>/CoreCLR.bundle/Contents/MacOS/ -> <foo>/CoreCLR.bundle/Contents/MacOS
- // <foo>/CoreCLR.bundle/Contents/MacOS -> <foo>/CoreCLR.bundle/Contents
- // <foo>/CoreCLR.bundle/Contents -> <foo>/CoreCLR.bundle
- for (int i = 0; i < 3; i++)
- {
- WCHAR * pwszLastSlash = PAL_wcsrchr(wszBundlePath, L'/');
- if (pwszLastSlash == NULL)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- goto LExit;
- }
-
- *pwszLastSlash = '\0';
- }
-
- // Create a CFStringRef representation of the bundle path.
- hPath = CFStringCreateWithCharacters(kCFAllocatorDefault, wszBundlePath, (CFIndex)PAL_wcslen(wszBundlePath));
- if (hPath == NULL)
- {
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- goto LExit;
- }
-
- // Create a CFURLRef representation of the bundle path.
- hURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, hPath, kCFURLPOSIXPathStyle, true);
- if (hURL == NULL)
- {
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- goto LExit;
- }
-
- // Create a handle to the CoreCLR bundle.
- hBundle = CFBundleCreate(kCFAllocatorDefault, hURL);
- if (hBundle == NULL)
- {
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- goto LExit;
- }
-
- cchVersionString = GetBundleVersionString(hBundle, pwszVersionString, cchVersionStringBuffer,
- pcchVersionStringBufferRequired);
-
-LExit:
- if (hURL != NULL)
- {
- CFRelease(hURL);
- }
-
- if (hPath != NULL)
- {
- CFRelease(hPath);
- }
-
- if (hBundle != NULL)
- {
- CFRelease(hBundle);
- }
-
- LOGEXIT("PAL_GetVersionString returns %u, pwszVersionString=\"%S\", *pcchVersionStringBufferRequired=%u\n",
- cchVersionString, (pwszVersionString ? pwszVersionString : W16_NULLSTRING),
- (pcchVersionStringBufferRequired ? *pcchVersionStringBufferRequired : 0));
- PERF_EXIT(PAL_GetVersionString);
- return cchVersionString;
-}
-
-//---------------------------------------------------------------------------------------
-//
-// Retrieve the version stored in the Info.plist file in the CoreCLR bundle.
-//
-// Arguments:
-// pwszVersionString - out parameter; buffer to be filled with the version string
-// cchVersionStringBuffer - size of the buffer in # of characters pointed to by pwszVersionString
-// pcchVersionStringBufferRequired - required size in characters, including NULL.
-//
-// Return Value:
-// Return the number of characters in the version string (excluding NULL) or 0 if the operation fails.
-//
-// Notes:
-// Call GetLastError() to retrieve more information if the function fails.
-//
-
-PALAPI
-DWORD
-PAL_GetCoreCLRVersionString(
- IN OUT WCHAR * pwszVersionString,
- IN DWORD cchVersionStringBuffer,
- IN DWORD *pcchVersionStringBufferRequired)
-{
- PERF_ENTRY(PAL_GetCoreCLRVersionString);
- ENTRY("PAL_GetCoreCLRVersionString (pwszVersionString=%p, cchVersionStringBuffer=%u, "
- "pcchVersionStringBufferRequired=%p)\n",
- pwszVersionString, cchVersionStringBuffer, pcchVersionStringBufferRequired);
-
- // various handles for dealing with the Core Foundation APIs
- CFBundleRef hBundle = NULL;
-
- DWORD cchVersionString = 0;
-
- // NOTE: This code knows that CORECLRHANDLE is actually a CFBundleRef
- hBundle = (CFBundleRef)FindCoreCLRHandle();
- if (hBundle == NULL)
- {
- SetLastError(ERROR_INVALID_DATA);
- goto LExit;
- }
-
- cchVersionString = GetBundleVersionString(hBundle, pwszVersionString, cchVersionStringBuffer,
- pcchVersionStringBufferRequired);
-
-LExit:
- if (hBundle != NULL)
- {
- CFRelease(hBundle);
- }
-
- LOGEXIT("PAL_GetCoreCLRVersionString returns %u, pwszVersionString=\"%S\", *pcchVersionStringBufferRequired=%u\n",
- cchVersionString, (pwszVersionString ? pwszVersionString : W16_NULLSTRING),
- (pcchVersionStringBufferRequired ? *pcchVersionStringBufferRequired : 0));
- PERF_EXIT(PAL_GetCoreCLRVersionString);
- return cchVersionString;
-}
-#else // __APPLE__
-
// Get base address of the coreclr module
PALAPI
LPCVOID
@@ -2598,5 +1950,3 @@ PAL_GetCoreClrModuleBase()
PERF_EXIT(PAL_GetCoreClrModuleBase);
return retval;
}
-
-#endif // __APPLE__
diff --git a/src/pal/src/locale/locale.cpp b/src/pal/src/locale/locale.cpp
index 5593ffe6ed..eb7c73dffe 100644
--- a/src/pal/src/locale/locale.cpp
+++ b/src/pal/src/locale/locale.cpp
@@ -359,7 +359,7 @@ static CFStringRef CFStringCreateMacFormattedLocaleName(LPCWSTR lpLocaleName)
return NULL;
}
- CFStringAppendCharacters(cfMutableLocaleName, lpLocaleName, PAL_wcslen(lpLocaleName));
+ CFStringAppendCharacters(cfMutableLocaleName, (const UniChar*)lpLocaleName, PAL_wcslen(lpLocaleName));
CFStringFindAndReplace(cfMutableLocaleName,
CFSTR("-"),
@@ -848,7 +848,7 @@ GetUserDefaultLocaleName(
SetLastError(ERROR_INSUFFICIENT_BUFFER);
goto EXIT;
}
- CFStringGetCharacters(cfLocaleName,CFRangeMake(0,iStrLen),lpLocaleName);
+ CFStringGetCharacters(cfLocaleName,CFRangeMake(0,iStrLen),(UniChar*)lpLocaleName);
lpLocaleName[iStrLen]=L'\0';
iRetVal=iStrLen+1;
@@ -1554,7 +1554,7 @@ GetCalendarInfoEx(
}
else if (cchData >= length + 1)
{
- CFStringGetCharacters(cfString, CFRangeMake(0, length), lpCalData);
+ CFStringGetCharacters(cfString, CFRangeMake(0, length), (UniChar*)lpCalData);
lpCalData[length] = L'\0';
nRetval = length + 1;
}
@@ -1614,7 +1614,7 @@ GetDateFormatHelper(
* expected by Core Foundation. However, currently no one calls this
* with a format where this would actually matter.
*/
- cfStringFormat = CFStringCreateWithCharacters(kCFAllocatorDefault, lpFormat, PAL_wcslen(lpFormat));
+ cfStringFormat = CFStringCreateWithCharacters(kCFAllocatorDefault, (const UniChar*)lpFormat, PAL_wcslen(lpFormat));
if (cfStringFormat == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -1645,7 +1645,7 @@ GetDateFormatHelper(
}
else if (cchDate >= length + 1)
{
- CFStringGetCharacters(cfStringDate, CFRangeMake(0, length), lpDateStr);
+ CFStringGetCharacters(cfStringDate, CFRangeMake(0, length), (UniChar*)lpDateStr);
lpDateStr[length] = L'\0';
nRetval = length + 1;
}
@@ -1945,13 +1945,13 @@ CompareStringHelper(
cchCount2 = PAL_wcslen( lpString2 );
}
- cfString1 = CFStringCreateWithCharacters(kCFAllocatorDefault, lpString1, cchCount1);
+ cfString1 = CFStringCreateWithCharacters(kCFAllocatorDefault, (const UniChar*)lpString1, cchCount1);
if (cfString1 == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto EXIT;
}
- cfString2 = CFStringCreateWithCharacters(kCFAllocatorDefault, lpString2, cchCount2);
+ cfString2 = CFStringCreateWithCharacters(kCFAllocatorDefault, (const UniChar*)lpString2, cchCount2);
if (cfString2 == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -3841,7 +3841,7 @@ CLEANUP:
}
else if (cchData >= length + 1)
{
- CFStringGetCharacters(cfString, CFRangeMake(0, length), lpLCData);
+ CFStringGetCharacters(cfString, CFRangeMake(0, length), (UniChar*)lpLCData);
lpLCData[length] = L'\0';
nRetval = length + 1;
}
@@ -4181,7 +4181,7 @@ GetSystemDefaultLocaleName(
SetLastError(ERROR_INSUFFICIENT_BUFFER);
goto EXIT;
}
- CFStringGetCharacters(cfLocaleName,CFRangeMake(0,iStrLen),lpLocaleName);
+ CFStringGetCharacters(cfLocaleName,CFRangeMake(0,iStrLen),(UniChar*)lpLocaleName);
lpLocaleName[iStrLen]=L'\0';
iRetVal=iStrLen+1;
@@ -4365,7 +4365,7 @@ static EnumResult EnumDateFormatsExExHelper(DATEFMT_ENUMPROCEXEXW lpDateFmtEnumP
goto EXIT;
}
- CFStringGetCharacters(cfString, CFRangeMake(0, length), buffer);
+ CFStringGetCharacters(cfString, CFRangeMake(0, length), (UniChar*)buffer);
buffer[length] = L'\0';
calid = CFLocaleGetCALID(cfLocale);
@@ -4514,7 +4514,7 @@ static EnumResult EnumTimeFormatsExHelper(TIMEFMT_ENUMPROCEXW lpTimeFmtEnumProc,
goto EXIT;
}
- CFStringGetCharacters(cfString, CFRangeMake(0, length), buffer);
+ CFStringGetCharacters(cfString, CFRangeMake(0, length), (UniChar*)buffer);
buffer[length] = L'\0';
TRACE("EnumTimeFormatsEx invoking callback for \"%S\"\n", buffer);
@@ -4661,7 +4661,7 @@ static BOOL EnumCalendarInfoExEx_Helper(
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
- CFStringGetCharacters(cfString, CFRangeMake(0, length), buffer);
+ CFStringGetCharacters(cfString, CFRangeMake(0, length), (UniChar*)buffer);
buffer[length] = L'\0';
TRACE("EnumCalendarInfoExEx invoking callback for \"%S\"\n", buffer);
@@ -4916,7 +4916,7 @@ LCMapStringHelper(
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto EXIT;
}
- CFStringAppendCharacters(cfMutableString, lpSrcStr, cchSrc);
+ CFStringAppendCharacters(cfMutableString, (const UniChar*)lpSrcStr, cchSrc);
switch (dwMapFlags)
{
@@ -4959,7 +4959,7 @@ LCMapStringHelper(
}
else
{
- CFStringGetCharacters(cfMutableString, CFRangeMake(0, nRetval), lpDestStr);
+ CFStringGetCharacters(cfMutableString, CFRangeMake(0, nRetval), (UniChar*)lpDestStr);
}
}
@@ -5085,7 +5085,7 @@ PAL_NormalizeStringExW(
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto EXIT;
}
- CFStringAppendCharacters(cfMutableString, lpSrcStr, cchSrc);
+ CFStringAppendCharacters(cfMutableString, (const UniChar*)lpSrcStr, cchSrc);
// TODO: Additionally, we should normalize according to the locale.
// Unfortunately, Core Foundation has no such function in Mac OS X 10.4.
@@ -5114,7 +5114,7 @@ PAL_NormalizeStringExW(
nRetval = 0;
goto EXIT;
}
- CFStringGetCharacters(cfMutableString, CFRangeMake(0, nRetval), lpDestStr);
+ CFStringGetCharacters(cfMutableString, CFRangeMake(0, nRetval), (UniChar*)lpDestStr);
if (nRetval != length)
{
lpDestStr[length] = L'\0';
@@ -5180,14 +5180,14 @@ PAL_ParseDateW(
goto EXIT;
}
- cfFormat = CFStringCreateWithCharacters(kCFAllocatorDefault, lpFormat, PAL_wcslen(lpFormat));
+ cfFormat = CFStringCreateWithCharacters(kCFAllocatorDefault, (const UniChar*)lpFormat, PAL_wcslen(lpFormat));
if (cfFormat == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto EXIT;
}
- cfString = CFStringCreateWithCharacters(kCFAllocatorDefault, lpString, PAL_wcslen(lpString));
+ cfString = CFStringCreateWithCharacters(kCFAllocatorDefault, (const UniChar*)lpString, PAL_wcslen(lpString));
if (cfString == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -5208,7 +5208,7 @@ PAL_ParseDateW(
CFDateFormatterSetFormat(cfFormatter,cfFormat);
// Does format contain 'Z'
- cfFormatString = CFStringCreateWithCharacters(kCFAllocatorDefault, lpFormat, PAL_wcslen(lpFormat));
+ cfFormatString = CFStringCreateWithCharacters(kCFAllocatorDefault, (const UniChar*)lpFormat, PAL_wcslen(lpFormat));
if (cfFormatString == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -5319,7 +5319,7 @@ PAL_FormatDateW(
goto EXIT;
}
- cfFormat = CFStringCreateWithCharacters(kCFAllocatorDefault, lpFormat, PAL_wcslen(lpFormat));
+ cfFormat = CFStringCreateWithCharacters(kCFAllocatorDefault, (const UniChar*)lpFormat, PAL_wcslen(lpFormat));
if (cfFormat == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -5482,7 +5482,7 @@ PAL_FormatDateW(
goto EXIT;
}
- CFStringGetCharacters(cfString,CFRangeMake(0, strLen),lpDestStr);
+ CFStringGetCharacters(cfString,CFRangeMake(0, strLen),(UniChar*)lpDestStr);
lpDestStr[strLen] = L'\0';
RetVal = strLen;
@@ -5723,7 +5723,7 @@ static BOOL CFNumberFormatterSetPropertyString(CFNumberFormatterRef formatter, C
// NULL means default
if (sPropertyValue == NULL)
return TRUE;
- CFStringRef cfPropertyValue = CFStringCreateWithCharacters(kCFAllocatorDefault, sPropertyValue, PAL_wcslen(sPropertyValue));
+ CFStringRef cfPropertyValue = CFStringCreateWithCharacters(kCFAllocatorDefault, (const UniChar*)sPropertyValue, PAL_wcslen(sPropertyValue));
if (cfPropertyValue == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -5761,11 +5761,11 @@ static BOOL CFNumberFormatterAdjust(CFNumberFormatterRef formatter, LPCSTR forma
case ' ': CFStringAppend(sFormat,CFSTR(" ")); break;
case '-':
if(sMinus)
- CFStringAppendCharacters(sFormat,sMinus,PAL_wcslen(sMinus));
+ CFStringAppendCharacters(sFormat,(const UniChar*)sMinus,PAL_wcslen(sMinus));
break;
case '$':
if(sDollar)
- CFStringAppendCharacters(sFormat,sDollar,PAL_wcslen(sDollar));
+ CFStringAppendCharacters(sFormat,(const UniChar*)sDollar,PAL_wcslen(sDollar));
break;
default:
@@ -5822,7 +5822,7 @@ static int CFNumberFormatHelper(CFNumberFormatterRef formatter, PALNUMBER number
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return -1;
}
- CFStringGetCharacters(cfFormattedNumber,CFRangeMake(0,iStrLen),pBuffer);
+ CFStringGetCharacters(cfFormattedNumber,CFRangeMake(0,iStrLen),(UniChar*)pBuffer);
pBuffer[iStrLen]=L'\0';
}
diff --git a/src/pal/src/locale/unicode.cpp b/src/pal/src/locale/unicode.cpp
index a33ef44f52..d3dd7940b2 100644
--- a/src/pal/src/locale/unicode.cpp
+++ b/src/pal/src/locale/unicode.cpp
@@ -1231,7 +1231,7 @@ ReleaseLock:
goto ReleaseString;
}
CFStringGetCharacters(cfString, CFRangeMake(0, length),
- lpWideCharStr);
+ (UniChar*)lpWideCharStr);
retval = length;
}
else
@@ -1559,7 +1559,7 @@ ReleaseLock:
}
cfString = CFStringCreateWithCharacters(kCFAllocatorDefault,
- lpWideCharStr, charsToConvert);
+ (const UniChar*)lpWideCharStr, charsToConvert);
if (cfString == NULL)
{
ERROR("CFString creation failed.\n");
diff --git a/src/pal/src/memory/heap.cpp b/src/pal/src/memory/heap.cpp
index 1ad5676229..3d9b94151a 100644
--- a/src/pal/src/memory/heap.cpp
+++ b/src/pal/src/memory/heap.cpp
@@ -446,7 +446,7 @@ HeapReAlloc(
{
CPalThread *pthrCurrent = InternalGetCurrentThread();
pthrCurrent->suspensionInfo.EnterUnsafeRegion();
- malloc_zone_realloc((malloc_zone_t *)hHeap, lpmem, fullsize);
+ pMem = (BYTE *) malloc_zone_realloc((malloc_zone_t *)hHeap, lpmem, fullsize);
pthrCurrent->suspensionInfo.LeaveUnsafeRegion();
}
#else // __APPLE__
diff --git a/src/pal/src/misc/fmtmessage.cpp b/src/pal/src/misc/fmtmessage.cpp
index 3a53b3b07b..ea7e98b792 100644
--- a/src/pal/src/misc/fmtmessage.cpp
+++ b/src/pal/src/misc/fmtmessage.cpp
@@ -49,7 +49,6 @@ SET_DEFAULT_DEBUG_CHANNEL(MISC);
/* Function pointers and handles. */
typedef VOID * HSATELLITE;
static HSATELLITE s_hSatellite = NULL;
-#if !defined(CORECLR) || !defined(__APPLE__)
static LPVOID s_lpLibRotorPalRt = NULL;
typedef HSATELLITE (__stdcall *FnLoadSatelliteResource)(LPCWSTR);
static FnLoadSatelliteResource LoadSatelliteResource;
@@ -57,45 +56,7 @@ typedef BOOL (__stdcall *FnFreeSatelliteResource)(HSATELLITE);
static FnFreeSatelliteResource FreeSatelliteResource;
typedef UINT (__stdcall *FnLoadSatelliteStringW)(HSATELLITE, UINT, LPWSTR, UINT);
static FnLoadSatelliteStringW LoadSatelliteStringW;
-#else // !CORECLR || !__APPLE__
-// Under CoreCLR/Mac both the PAL and PALRT are statically linked. Thus we can reference the resource
-// routines from the runtime without using GetProcAddress.
-EXTERN_C HSATELLITE PALAPI PAL_LoadSatelliteResourceW(LPCWSTR SatelliteResourceFileName);
-EXTERN_C BOOL PALAPI PAL_FreeSatelliteResource(HSATELLITE SatelliteResource);
-EXTERN_C UINT PALAPI PAL_LoadSatelliteStringW(HSATELLITE SatelliteResource,
- UINT uID,
- LPWSTR lpBuffer,
- UINT nBufferMax);
-#define LoadSatelliteResource PAL_LoadSatelliteResourceW
-#define FreeSatelliteResource PAL_FreeSatelliteResource
-#define LoadSatelliteStringW PAL_LoadSatelliteStringW
-
-// We are still a few build tools that link in rotor_pal before rotor_palrt has even been built. For
-// these guys we have the linker redirect the symbol lookups back here to stubs that will assert an
-// error message (this is no worse than the non-CoreCLR behavior where the runtime dynamic library
-// load would fail if triggered by one of these build tools).
-EXTERN_C HSATELLITE PALAPI PAL_LoadSatelliteResourceW_NoRT(LPCWSTR SatelliteResourceFileName)
-{
- ASSERT("Tried to call PAL_LoadSatelliteResourceW from an image not linked with rotor_palrt\n");
- return NULL;
-}
-EXTERN_C BOOL PALAPI PAL_FreeSatelliteResource_NoRT(HSATELLITE SatelliteResource)
-{
- ASSERT("Tried to call PAL_FreeSatelliteResource from an image not linked with rotor_palrt\n");
- return FALSE;
-}
-EXTERN_C UINT PALAPI PAL_LoadSatelliteStringW_NoRT(HSATELLITE SatelliteResource,
- UINT uID,
- LPWSTR lpBuffer,
- UINT nBufferMax)
-{
- ASSERT("Tried to call PAL_LoadSatelliteStringW from an image not linked with rotor_palrt\n");
- return 0;
-}
-
-#endif // !CORECLR || !__APPLE__
-#if !defined(CORECLR) || !defined(__APPLE__)
/*++
Function :
@@ -145,7 +106,6 @@ static LPVOID FMTMSG_LoadLibrary( )
error:
return s_lpLibRotorPalRt;
}
-#endif // !CORECLR || !__APPLE__
/*++
@@ -160,9 +120,6 @@ Function :
static HSATELLITE FMTMSG_FormatMessageInit( void )
{
static const WCHAR ROTORPALSATFILE[] = {
-#ifndef CORECLR
- 'r','o','t','o','r','_',
-#endif // !CORECLR
'p','a','l','.','s','a','t','e','l','l','i','t','e', '\0'
};
@@ -170,7 +127,6 @@ static HSATELLITE FMTMSG_FormatMessageInit( void )
HSATELLITE hSatellite;
-#if !defined(CORECLR) || !defined(__APPLE__)
LPVOID lpLibRotorPalRt;
TRACE( "Initilizing the dynamic library and the satellite files.\n" );
@@ -202,7 +158,6 @@ static HSATELLITE FMTMSG_FormatMessageInit( void )
"Reason %s.\n", dlerror() );
goto error;
}
-#endif // !CORECLR || !__APPLE__
/* Load the satellite file. */
if ( !PAL_GetPALDirectoryW( SatPathAndFile, MAX_PATH ) )
@@ -245,23 +200,19 @@ Function :
BOOL FMTMSG_FormatMessageCleanUp( void )
{
TRACE( "Cleaning up the dynamic library and the satellite files.\n" );
-#if !defined(CORECLR) || !defined(__APPLE__)
if ( s_lpLibRotorPalRt )
{
-#endif // !CORECLR || !__APPLE__
if (s_hSatellite)
{
(*FreeSatelliteResource)(s_hSatellite);
s_hSatellite = NULL;
}
-#if !defined(CORECLR) || !defined(__APPLE__)
if ( dlclose( s_lpLibRotorPalRt ) != 0 )
{
ASSERT( "Unable to close the dynamic library\n" );
}
s_lpLibRotorPalRt = NULL;
}
-#endif // !CORECLR || !__APPLE__
return TRUE;
}
diff --git a/src/pal/src/misc/miscpalapi.cpp b/src/pal/src/misc/miscpalapi.cpp
index 8342cd2327..c2d7d6e2fa 100644
--- a/src/pal/src/misc/miscpalapi.cpp
+++ b/src/pal/src/misc/miscpalapi.cpp
@@ -60,7 +60,6 @@ BOOL
PALAPI
PAL_GetPALDirectoryW( OUT LPWSTR lpDirectoryName, IN UINT cchDirectoryName )
{
-#if !defined(CORECLR) || !defined(__APPLE__)
LPWSTR lpFullPathAndName = NULL;
LPWSTR lpEndPoint = NULL;
BOOL bRet = FALSE;
@@ -110,68 +109,6 @@ EXIT:
LOGEXIT( "PAL_GetPALDirectoryW returns BOOL %d.\n", bRet);
PERF_EXIT(PAL_GetPALDirectoryW);
return bRet;
-#else // !CORECLR || !__APPLE__
- BOOL bRet = FALSE;
- char szDirectory[MAX_PATH + 1];
-
- PERF_ENTRY(PAL_GetPALDirectoryW);
- ENTRY( "PAL_GetPALDirectoryW( %p, %d )\n", lpDirectoryName, cchDirectoryName );
-
- // Under CoreCLR/Mac PAL is not a separate dynamic library, but is statically linked instead. Under normal
- // circumstances the PAL will be linked into a single binary containing all the CoreCLR code, but there
- // are still cases where build tools depend upon and statically link the PAL themselves. We can tell the
- // difference because CoreCLR initialization sets the value of the g_szCoreCLRPath to the very information
- // we want to return here. If this has not been set we'll assume this is a standalone PAL and derive the
- // installation directory from the main executable directory.
- if (g_szCoreCLRPath[0] != '\0')
- {
- if (strlen(g_szCoreCLRPath) >= sizeof(szDirectory))
- {
- ASSERT("Internal buffer not large enough");
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- goto EXIT;
- }
- strcpy_s(szDirectory, sizeof(szDirectory), g_szCoreCLRPath);
- }
- else
- {
- // We must be a standalone PAL linked into some application (e.g. the build tools such as build.exe or
- // fxprun). So our installation directory is simply the directory the executable resides in.
- uint32_t bufsize = sizeof(szDirectory);
- if (_NSGetExecutablePath(szDirectory, &bufsize))
- {
- ASSERT("_NSGetExecutablePath failure\n");
- SetLastError(ERROR_INTERNAL_ERROR);
- goto EXIT;
- }
-
- // Strip off executable name (but leave trailing '/').
- char *pszLastSlash = rindex(szDirectory, '/');
- if (pszLastSlash == NULL)
- {
- ASSERT("_NSGetExecutablePath returned filename without path\n");
- SetLastError(ERROR_INTERNAL_ERROR);
- goto EXIT;
- }
- pszLastSlash[1] = '\0';
- }
-
- // Once we get here we have the directory in 8-bit format in szDirectory, just need to convert
- // it to wide characters now.
- if (MultiByteToWideChar(CP_UTF8, 0, szDirectory, -1, lpDirectoryName, cchDirectoryName) == 0)
- {
- ASSERT("PAL_GetPALDirectoryW: MultiByteToWideChar failed\n");
- SetLastError(ERROR_INTERNAL_ERROR);
- goto EXIT;
- }
-
- bRet = TRUE;
-
-EXIT:
- LOGEXIT( "PAL_GetPALDirectoryW returns BOOL %d.\n", bRet);
- PERF_EXIT(PAL_GetPALDirectoryW);
- return bRet;
-#endif // !CORECLR || !__APPLE__
}
PALIMPORT
diff --git a/src/pal/src/misc/version.cpp b/src/pal/src/misc/version.cpp
index 0b714e0379..04c5cd8e28 100644
--- a/src/pal/src/misc/version.cpp
+++ b/src/pal/src/misc/version.cpp
@@ -257,7 +257,7 @@ GetVersionExW(
if (len > static_cast<int>((sizeof(lpVersionInformation->szCSDVersion)/2) - 1))
len = (sizeof(lpVersionInformation->szCSDVersion)/2) - 1;
CFStringGetCharacters(serviceRelease, CFRangeMake(0, len),
- lpVersionInformation->szCSDVersion);
+ (UniChar*)lpVersionInformation->szCSDVersion);
lpVersionInformation->szCSDVersion[len] = 0;
CFRelease(serviceRelease);
}
diff --git a/src/pal/tools/cppmunge/cppmunge.c b/src/pal/tools/cppmunge/cppmunge.c
index d661461861..56a9a2cfc0 100644
--- a/src/pal/tools/cppmunge/cppmunge.c
+++ b/src/pal/tools/cppmunge/cppmunge.c
@@ -35,7 +35,9 @@
#include <assert.h>
#include <ctype.h>
+#if !defined(__APPLE__)
#include <linux/limits.h>
+#endif
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/src/pal/tools/gen-buildsys-clang.sh b/src/pal/tools/gen-buildsys-clang.sh
index 723fc1d0e0..ff7c2a9c86 100755
--- a/src/pal/tools/gen-buildsys-clang.sh
+++ b/src/pal/tools/gen-buildsys-clang.sh
@@ -24,15 +24,27 @@ else
buildtype=$2
fi
+OS=`uname`
+
# Locate llvm
# This can be a little complicated, because the common use-case of Ubuntu with
# llvm-3.5 installed uses a rather unusual llvm installation with the version
# number postfixed (i.e. llvm-ar-3.5), so we check for that first.
+# Additionally, OSX doesn't use the llvm- prefix.
+if [ $OS = "Linux" ]; then
+ llvm_prefix="llvm-"
+elif [ $OS = "Darwin" ]; then
+ llvm_prefix=""
+else
+ echo "Unable to determine build platform"
+ exit 1
+fi
+
desired_llvm_version=3.5
locate_llvm_exec() {
- if which $1-$desired_llvm_version > /dev/null 2>&1
+ if which $llvm_prefix$1-$desired_llvm_version > /dev/null 2>&1
then
- echo $(which $1-$desired_llvm_version)
+ echo $(which $llvm_prefix$1-$desired_llvm_version)
elif which $1 > /dev/null 2>&1
then
echo $(which $1)
@@ -40,16 +52,18 @@ locate_llvm_exec() {
exit 1
fi
}
-llvm_ar=$(locate_llvm_exec llvm-ar)
+llvm_ar=$(locate_llvm_exec ar)
[[ $? -eq 0 ]] || { echo "Unable to locate llvm-ar"; exit 1; }
-llvm_link=$(locate_llvm_exec llvm-link)
+llvm_link=$(locate_llvm_exec link)
[[ $? -eq 0 ]] || { echo "Unable to locate llvm-link"; exit 1; }
-llvm_nm=$(locate_llvm_exec llvm-nm)
+llvm_nm=$(locate_llvm_exec nm)
[[ $? -eq 0 ]] || { echo "Unable to locate llvm-nm"; exit 1; }
-llvm_objdump=$(locate_llvm_exec llvm-objdump)
-[[ $? -eq 0 ]] || { echo "Unable to locate llvm-objdump"; exit 1; }
-llvm_ranlib=$(locate_llvm_exec llvm-ranlib)
+llvm_ranlib=$(locate_llvm_exec ranlib)
[[ $? -eq 0 ]] || { echo "Unable to locate llvm-ranlib"; exit 1; }
+if [ $OS = "Linux" ]; then
+ llvm_objdump=$(locate_llvm_exec objdump)
+ [[ $? -eq 0 ]] || { echo "Unable to locate llvm-objdump"; exit 1; }
+fi
cmake -DCMAKE_USER_MAKE_RULES_OVERRIDE=$1/src/pal/tools/clang-compiler-override.txt \
-DCMAKE_AR=$llvm_ar \
diff --git a/src/vm/amd64/cgencpu.h b/src/vm/amd64/cgencpu.h
index ccc7d519e9..68a45f8e19 100644
--- a/src/vm/amd64/cgencpu.h
+++ b/src/vm/amd64/cgencpu.h
@@ -56,8 +56,10 @@ EXTERN_C void FastCallFinalizeWorker(Object *obj, PCODE funcPtr);
#define HAS_NDIRECT_IMPORT_PRECODE 1
//#define HAS_REMOTING_PRECODE 1 // TODO: Implement
+#if !defined(__APPLE__)
#define HAS_FIXUP_PRECODE 1
#define HAS_FIXUP_PRECODE_CHUNKS 1
+#endif
// ThisPtrRetBufPrecode one is necessary for closed delegates over static methods with return buffer
#define HAS_THISPTR_RETBUF_PRECODE 1
diff --git a/src/vm/amd64/jithelpers_fast.S b/src/vm/amd64/jithelpers_fast.S
index cdaa48e1a8..a981254806 100644
--- a/src/vm/amd64/jithelpers_fast.S
+++ b/src/vm/amd64/jithelpers_fast.S
@@ -16,12 +16,11 @@ LEAF_END JIT_PatchedCodeStart, _TEXT
// change at runtime as the GC changes. Initially it should simply be a copy of the
// larger of the two functions (JIT_WriteBarrier_PostGrow) to ensure we have created
// enough space to copy that code in.
- .align 16
+.balign 16
LEAF_ENTRY JIT_WriteBarrier, _TEXT
-
#ifdef _DEBUG
// In debug builds, this just contains jump to the debug version of the write barrier by default
- jmp JIT_WriteBarrier_Debug
+ jmp C_FUNC(JIT_WriteBarrier_Debug)
#endif
// Do the move into the GC . It is correct to take an AV here, the EH code
@@ -38,38 +37,41 @@ LEAF_ENTRY JIT_WriteBarrier, _TEXT
// a special non-volatile calling convention, this should be changed to
// just one.
- movabs rax, 0F0F0F0F0F0F0F0F0h
+ movabs rax, 0xF0F0F0F0F0F0F0F0
// Check the lower and upper ephemeral region bounds
cmp rsi, rax
- jb Exit
+ // jb Exit
+ .byte 0x72, 0x36
nop // padding for alignment of constant
- movabs r8, 0F0F0F0F0F0F0F0F0h
+ movabs r8, 0xF0F0F0F0F0F0F0F0
cmp rsi, r8
- jae Exit
+ // jae Exit
+ .byte 0x73, 0x26
nop // padding for alignment of constant
- movabs rax, 0F0F0F0F0F0F0F0F0h
+ movabs rax, 0xF0F0F0F0F0F0F0F0
// Touch the card table entry, if not already dirty.
shr rdi, 0Bh
cmp byte ptr [rdi + rax], 0FFh
- jne UpdateCardTable
+ // jne UpdateCardTable
+ .byte 0x75, 0x02
REPRET
UpdateCardTable:
mov byte ptr [rdi + rax], 0FFh
ret
- .align 16
+ .balign 16
Exit:
REPRET
// make sure this guy is bigger than any of the other guys
- .align 16
+ .balign 16
nop
LEAF_END_MARKED JIT_WriteBarrier, _TEXT
@@ -99,12 +101,15 @@ LEAF_ENTRY JIT_CheckedWriteBarrier, _TEXT
// See if this is in GCHeap
PREPARE_EXTERNAL_VAR g_lowest_address, rax
cmp rdi, [rax]
- jb NotInHeap
+ // jb NotInHeap
+ .byte 0x72, 0x0e
PREPARE_EXTERNAL_VAR g_highest_address, rax
cmp rdi, [rax]
- jnb NotInHeap
+ // jnb NotInHeap
+ .byte 0x73, 0x02
- jmp JIT_WriteBarrier
+ // call C_FUNC(JIT_WriteBarrier)
+ .byte 0xeb, 0x84
NotInHeap:
// See comment above about possible AV
@@ -228,7 +233,7 @@ LEAF_ENTRY JIT_ByRefWriteBarrier, _TEXT
mov byte ptr [rcx], 0FFh
ret
- .align 16
+ .balign 16
NotInHeap_ByRefWriteBarrier:
// If WRITE_BARRIER_CHECK then we won't have already done the mov and should do it here
// If !WRITE_BARRIER_CHECK we want _NotInHeap and _Leave to be the same and have both
diff --git a/src/vm/amd64/jithelpers_fastwritebarriers.S b/src/vm/amd64/jithelpers_fastwritebarriers.S
index d1366e825b..1e225b0b5b 100644
--- a/src/vm/amd64/jithelpers_fastwritebarriers.S
+++ b/src/vm/amd64/jithelpers_fastwritebarriers.S
@@ -6,7 +6,7 @@
.intel_syntax noprefix
#include "unixasmmacros.inc"
- .align 4
+ .balign 4
LEAF_ENTRY JIT_WriteBarrier_PreGrow32, _TEXT
// Do the move into the GC . It is correct to take an AV here, the EH code
// figures out that this came from a WriteBarrier and correctly maps it back
@@ -18,12 +18,14 @@ LEAF_ENTRY JIT_WriteBarrier_PreGrow32, _TEXT
PATCH_LABEL JIT_WriteBarrier_PreGrow32_PatchLabel_Lower
cmp rsi, -0F0F0F10h // 0F0F0F0F0h
- jb Exit_PreGrow32
+ .byte 0x72, 0x22
+ // jb Exit_PreGrow32
shr rdi, 0Bh
PATCH_LABEL JIT_WriteBarrier_PreGrow32_PatchLabel_CardTable_Check
cmp byte ptr [rdi + 0F0F0F0F0h], 0FFh
- jne UpdateCardTable_PreGrow32
+ .byte 0x75, 0x03
+ // jne UpdateCardTable_PreGrow32
REPRET
nop // padding for alignment of constant
@@ -33,12 +35,12 @@ PATCH_LABEL JIT_WriteBarrier_PreGrow32_PatchLabel_CardTable_Update
mov byte ptr [rdi + 0F0F0F0F0h], 0FFh
ret
- .align 16
+ .balign 16
Exit_PreGrow32:
REPRET
LEAF_END_MARKED JIT_WriteBarrier_PreGrow32, _TEXT
- .align 8
+ .balign 8
LEAF_ENTRY JIT_WriteBarrier_PreGrow64, _TEXT
// Do the move into the GC . It is correct to take an AV here, the EH code
// figures out that this came from a WriteBarrier and correctly maps it back
@@ -51,33 +53,35 @@ LEAF_ENTRY JIT_WriteBarrier_PreGrow64, _TEXT
// Can't compare a 64 bit immediate, so we have to move it into a
// register. Value of this immediate will be patched at runtime.
PATCH_LABEL JIT_WriteBarrier_PreGrow64_Patch_Label_Lower
- movabs rax, 0F0F0F0F0F0F0F0F0h
+ movabs rax, 0xF0F0F0F0F0F0F0F0
// Check the lower ephemeral region bound.
cmp rsi, rax
- jb Exit_PreGrow64
+ .byte 0x72, 0x23
+ // jb Exit_PreGrow64
nop // padding for alignment of constant
PATCH_LABEL JIT_WriteBarrier_PreGrow64_Patch_Label_CardTable
- movabs rax, 0F0F0F0F0F0F0F0F0h
+ movabs rax, 0xF0F0F0F0F0F0F0F0
// Touch the card table entry, if not already dirty.
shr rdi, 0Bh
cmp byte ptr [rdi + rax], 0FFh
- jne UpdateCardTable_PreGrow64
+ .byte 0x75, 0x02
+ // jne UpdateCardTable_PreGrow64
REPRET
UpdateCardTable_PreGrow64:
mov byte ptr [rdi + rax], 0FFh
ret
- .align 16
+ .balign 16
Exit_PreGrow64:
REPRET
LEAF_END_MARKED JIT_WriteBarrier_PreGrow64, _TEXT
- .align 8
+ .balign 8
// See comments for JIT_WriteBarrier_PreGrow (above).
LEAF_ENTRY JIT_WriteBarrier_PostGrow64, _TEXT
// Do the move into the GC . It is correct to take an AV here, the EH code
@@ -94,41 +98,44 @@ LEAF_ENTRY JIT_WriteBarrier_PostGrow64, _TEXT
// a special non-volatile calling convention, this should be changed to
// just one.
PATCH_LABEL JIT_WriteBarrier_PostGrow64_Patch_Label_Lower
- movabs rax, 0F0F0F0F0F0F0F0F0h
+ movabs rax, 0xF0F0F0F0F0F0F0F0
// Check the lower and upper ephemeral region bounds
cmp rsi, rax
- jb Exit_PostGrow64
+ .byte 0x72,0x33
+ // jb Exit_PostGrow64
nop // padding for alignment of constant
PATCH_LABEL JIT_WriteBarrier_PostGrow64_Patch_Label_Upper
- movabs r8, 0F0F0F0F0F0F0F0F0h
+ movabs r8, 0xF0F0F0F0F0F0F0F0
cmp rsi, r8
- jae Exit_PostGrow64
+ .byte 0x73,0x23
+ // jae Exit_PostGrow64
nop // padding for alignment of constant
PATCH_LABEL JIT_WriteBarrier_PostGrow64_Patch_Label_CardTable
- movabs rax, 0F0F0F0F0F0F0F0F0h
+ movabs rax, 0xF0F0F0F0F0F0F0F0
// Touch the card table entry, if not already dirty.
shr rdi, 0Bh
cmp byte ptr [rdi + rax], 0FFh
- jne UpdateCardTable_PostGrow64
+ .byte 0x75, 0x02
+ // jne UpdateCardTable_PostGrow64
REPRET
UpdateCardTable_PostGrow64:
mov byte ptr [rdi + rax], 0FFh
ret
- .align 16
+ .balign 16
Exit_PostGrow64:
REPRET
LEAF_END_MARKED JIT_WriteBarrier_PostGrow64, _TEXT
- .align 4
+ .balign 4
LEAF_ENTRY JIT_WriteBarrier_PostGrow32, _TEXT
// Do the move into the GC . It is correct to take an AV here, the EH code
// figures out that this came from a WriteBarrier and correctly maps it back
@@ -142,20 +149,23 @@ LEAF_ENTRY JIT_WriteBarrier_PostGrow32, _TEXT
PATCH_LABEL JIT_WriteBarrier_PostGrow32_PatchLabel_Lower
cmp rsi, -0F0F0F10h // 0F0F0F0F0h
- jb Exit_PostGrow32
+ .byte 0x72, 0x2e
+ // jb Exit_PostGrow32
NOP_3_BYTE // padding for alignment of constant
PATCH_LABEL JIT_WriteBarrier_PostGrow32_PatchLabel_Upper
cmp rsi, -0F0F0F10h // 0F0F0F0F0h
- jae Exit_PostGrow32
+ .byte 0x73, 0x22
+ // jae Exit_PostGrow32
// Touch the card table entry, if not already dirty.
shr rdi, 0Bh
PATCH_LABEL JIT_WriteBarrier_PostGrow32_PatchLabel_CheckCardTable
cmp byte ptr [rdi + 0F0F0F0F0h], 0FFh
- jne UpdateCardTable_PostGrow32
+ .byte 0x75, 0x03
+ // jne UpdateCardTable_PostGrow32
REPRET
nop // padding for alignment of constant
@@ -165,13 +175,13 @@ PATCH_LABEL JIT_WriteBarrier_PostGrow32_PatchLabel_UpdateCardTable
mov byte ptr [rdi + 0F0F0F0F0h], 0FFh
ret
- .align 16
+ .balign 16
Exit_PostGrow32:
REPRET
LEAF_END_MARKED JIT_WriteBarrier_PostGrow32, _TEXT
- .align 4
+ .balign 4
LEAF_ENTRY JIT_WriteBarrier_SVR32, _TEXT
//
// SVR GC has multiple heaps, so it cannot provide one single
@@ -192,7 +202,8 @@ LEAF_ENTRY JIT_WriteBarrier_SVR32, _TEXT
PATCH_LABEL JIT_WriteBarrier_SVR32_PatchLabel_CheckCardTable
cmp byte ptr [rdi + 0F0F0F0F0h], 0FFh
- jne UpdateCardTable_SVR32
+ .byte 0x75, 0x03
+ // jne UpdateCardTable_SVR32
REPRET
nop // padding for alignment of constant
@@ -203,7 +214,7 @@ PATCH_LABEL JIT_WriteBarrier_SVR32_PatchLabel_UpdateCardTable
ret
LEAF_END_MARKED JIT_WriteBarrier_SVR32, _TEXT
- .align 8
+ .balign 8
LEAF_ENTRY JIT_WriteBarrier_SVR64, _TEXT
//
// SVR GC has multiple heaps, so it cannot provide one single
@@ -221,12 +232,13 @@ LEAF_ENTRY JIT_WriteBarrier_SVR64, _TEXT
NOP_3_BYTE // padding for alignment of constant
PATCH_LABEL JIT_WriteBarrier_SVR64_PatchLabel_CardTable
- movabs rax, 0F0F0F0F0F0F0F0F0h
+ movabs rax, 0xF0F0F0F0F0F0F0F0
shr rdi, 0Bh
cmp byte ptr [rdi + rax], 0FFh
- jne UpdateCardTable_SVR64
+ .byte 0x75, 0x02
+ // jne UpdateCardTable_SVR64
REPRET
UpdateCardTable_SVR64:
diff --git a/src/vm/amd64/jithelpers_slow.S b/src/vm/amd64/jithelpers_slow.S
index 32b0d5fdaf..0cd5768f35 100644
--- a/src/vm/amd64/jithelpers_slow.S
+++ b/src/vm/amd64/jithelpers_slow.S
@@ -92,7 +92,7 @@ LEAF_ENTRY JIT_WriteBarrier_Debug, _TEXT
mov byte ptr [rdi], 0FFh
ret
- .align 16
+ .balign 16
Exit_Debug:
REPRET
LEAF_END_MARKED JIT_WriteBarrier_Debug, _TEXT
diff --git a/src/vm/amd64/theprestubamd64.S b/src/vm/amd64/theprestubamd64.S
index 7966b2c87e..dd9a042f16 100644
--- a/src/vm/amd64/theprestubamd64.S
+++ b/src/vm/amd64/theprestubamd64.S
@@ -8,14 +8,14 @@
#include "asmconstants.h"
NESTED_ENTRY ThePreStub, _TEXT, ProcessCLRException
- PROLOG_WITH_TRANSITION_BLOCK
+ PROLOG_WITH_TRANSITION_BLOCK 0, 0, 0, 0, 0
//
// call PreStubWorker
//
lea rdi, [rsp + __PWTB_TransitionBlock] // pTransitionBlock*
mov rsi, METHODDESC_REGISTER
- call PreStubWorker
+ call C_FUNC(PreStubWorker)
EPILOG_WITH_TRANSITION_BLOCK_TAILCALL
TAILJMP_RAX
diff --git a/src/vm/amd64/unixasmhelpers.S b/src/vm/amd64/unixasmhelpers.S
index cc271ea938..8db8815849 100644
--- a/src/vm/amd64/unixasmhelpers.S
+++ b/src/vm/amd64/unixasmhelpers.S
@@ -27,7 +27,7 @@ LEAF_ENTRY PrecodeFixupThunk, _TEXT
lea METHODDESC_REGISTER,[rax+r11*8]
// Tail call to prestub
- jmp ThePreStub
+ jmp C_FUNC(ThePreStub)
LEAF_END PrecodeFixupThunk, _TEXT
@@ -94,7 +94,7 @@ LEAF_END HelperMethodFrameRestoreState, _TEXT
// generation will need to altered accordingly.
//
// EXTERN_C VOID __stdcall NDirectImportThunk()//
-NESTED_ENTRY NDirectImportThunk, _TEXT
+NESTED_ENTRY NDirectImportThunk, _TEXT, Handler
//
// Save integer parameter registers.
@@ -116,7 +116,7 @@ NESTED_ENTRY NDirectImportThunk, _TEXT
// Call NDirectImportWorker w/ the NDirectMethodDesc*
//
mov rdi, METHODDESC_REGISTER
- call NDirectImportWorker
+ call C_FUNC(NDirectImportWorker)
RESTORE_FLOAT_ARGUMENT_REGISTERS 0
@@ -150,7 +150,7 @@ LEAF_END moveOWord, _TEXT
//
// The JIT expects this helper to preserve registers used for return values
//
-NESTED_ENTRY JIT_RareDisableHelper, _TEXT
+NESTED_ENTRY JIT_RareDisableHelper, _TEXT, Handler
// First integer return register
push rax
@@ -163,7 +163,7 @@ NESTED_ENTRY JIT_RareDisableHelper, _TEXT
// Second float return register
movdqa [rsp+0x10], xmm1
- call JIT_RareDisableHelperWorker
+ call C_FUNC(JIT_RareDisableHelperWorker)
movdqa xmm0, [rsp]
movdqa xmm1, [rsp+0x10]
@@ -173,3 +173,20 @@ NESTED_ENTRY JIT_RareDisableHelper, _TEXT
ret
NESTED_END JIT_RareDisableHelper, _TEXT
+
+LEAF_ENTRY SinglecastDelegateInvokeStub, _TEXT
+
+ test rdi, rdi
+ jz NullObject
+
+
+ mov rax, [rdi + OFFSETOF__DelegateObject___methodPtr]
+ mov rdi, [rdi + OFFSETOF__DelegateObject___target] // replace "this" pointer
+
+ jmp rax
+
+NullObject:
+ mov rdi, CORINFO_NullReferenceException_ASM
+ jmp C_FUNC(JIT_InternalThrow)
+
+LEAF_END SinglecastDelegateInvokeStub, _TEXT
diff --git a/src/vm/amd64/unixasmmacros.inc b/src/vm/amd64/unixasmmacros.inc
index ded46bddce..79d2ea5044 100644
--- a/src/vm/amd64/unixasmmacros.inc
+++ b/src/vm/amd64/unixasmmacros.inc
@@ -24,21 +24,33 @@
.byte 0xE0
.endm
+#if defined(__APPLE__)
+#define C_FUNC(name) _##name
+#else
+#define C_FUNC(name) name
+#endif
+
.macro PATCH_LABEL Name
- .global \Name
-\Name:
+ .global C_FUNC(\Name)
+C_FUNC(\Name):
.endm
.macro LEAF_ENTRY Name, Section
- .global \Name
+ .global C_FUNC(\Name)
+#if defined(__APPLE__)
+ .text
+#else
.type \Name, %function
-\Name:
+#endif
+C_FUNC(\Name):
.endm
.macro LEAF_END_MARKED Name, Section
-\Name\()_End:
- .global \Name\()_End
+C_FUNC(\Name\()_End):
+ .global C_FUNC(\Name\()_End)
+#if !defined(__APPLE__)
.size \Name, .-\Name
+#endif
.endm
.macro LEAF_END Name, Section
@@ -46,7 +58,7 @@
.endm
.macro PREPARE_EXTERNAL_VAR Name, HelperReg
- mov \HelperReg, [rip + \Name@GOTPCREL]
+ mov \HelperReg, [rip + C_FUNC(\Name)@GOTPCREL]
.endm
.macro push_nonvol_reg Register
diff --git a/src/vm/amd64/unixstubs.cpp b/src/vm/amd64/unixstubs.cpp
index d7a86bb826..c51ca40e4c 100644
--- a/src/vm/amd64/unixstubs.cpp
+++ b/src/vm/amd64/unixstubs.cpp
@@ -47,11 +47,6 @@ extern "C"
PORTABILITY_ASSERT("Implement for PAL");
}
- void SinglecastDelegateInvokeStub()
- {
- PORTABILITY_ASSERT("Implement for PAL");
- }
-
void TheUMEntryPrestub()
{
PORTABILITY_ASSERT("Implement for PAL");
diff --git a/src/vm/amd64/virtualcallstubamd64.S b/src/vm/amd64/virtualcallstubamd64.S
index 2271631c7c..e86e3b9535 100644
--- a/src/vm/amd64/virtualcallstubamd64.S
+++ b/src/vm/amd64/virtualcallstubamd64.S
@@ -24,9 +24,9 @@
// or the ResolveCacheElem when r11 has the PROMOTE_CHAIN_FLAG set
// [rsp+8] m_ReturnAddress: contains the return address of caller to stub
-NESTED_ENTRY ResolveWorkerAsmStub, _TEXT
+NESTED_ENTRY ResolveWorkerAsmStub, _TEXT, Handler
- PROLOG_WITH_TRANSITION_BLOCK 0, 8, rdx
+ PROLOG_WITH_TRANSITION_BLOCK 0, 8, rdx, 0, 0
// token stored in rdx by prolog
@@ -36,7 +36,7 @@ NESTED_ENTRY ResolveWorkerAsmStub, _TEXT
and rcx, 7 // flags
sub rsi, rcx // indirection cell
- call VSD_ResolveWorker
+ call C_FUNC(VSD_ResolveWorker)
EPILOG_WITH_TRANSITION_BLOCK_TAILCALL
TAILJMP_RAX
@@ -85,6 +85,6 @@ Fail_RWCLAS:
pop rsi // Restore the original saved rdx value
push r10 // pass the DispatchToken or ResolveCacheElem to promote to ResolveWorkerAsmStub
- jmp ResolveWorkerAsmStub
+ jmp C_FUNC(ResolveWorkerAsmStub)
LEAF_END ResolveWorkerChainLookupAsmStub, _TEXT