summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--CMakeLists.txt23
-rw-r--r--Documentation/intro-to-clr.md8
-rwxr-xr-xbuild.sh10
-rw-r--r--src/CMakeLists.txt8
-rw-r--r--src/coreclr/hosts/coreconsole/coreconsole.cpp19
-rw-r--r--src/coreclr/hosts/corerun/corerun.cpp23
-rw-r--r--src/coreclr/hosts/unixcorerun/corerun.cpp6
-rw-r--r--src/debug/CMakeLists.txt4
-rw-r--r--src/debug/di/amd64/floatconversion.S2
-rw-r--r--src/debug/ee/amd64/dbghelpers.S4
-rw-r--r--src/dlls/CMakeLists.txt4
-rw-r--r--src/dlls/mscoree/coreclr/CMakeLists.txt9
-rw-r--r--src/mscorlib/src/System/Resources/ResourceReader.cs34
-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.S17
-rw-r--r--src/pal/src/arch/i386/context.cpp41
-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.cpp85
-rw-r--r--src/pal/src/exception/machmessage.cpp2
-rw-r--r--src/pal/src/exception/machmessage.h4
-rw-r--r--src/pal/src/exception/seh-unwind.cpp2
-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.cpp60
-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/src/safecrt/output.inl2
-rw-r--r--src/pal/src/safecrt/safecrt_output_l.c2
-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
50 files changed, 1419 insertions, 1637 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/Documentation/intro-to-clr.md b/Documentation/intro-to-clr.md
index d17d890573..bb76c4cfe6 100644
--- a/Documentation/intro-to-clr.md
+++ b/Documentation/intro-to-clr.md
@@ -103,13 +103,13 @@ Managed code has additional requirements on it: not only must it track all the G
###The "World" of Managed Code
-The result is that special bookkeeping is needed at every transition to and from managed code. Managed code effectively lives in its own "world" where execution can't enter or leave unless the CLR knows about it. The two worlds are in a very real sense distinct from one another (at any point in time the code is in the _managed world_ or the _unmanaged world_. Moreover, because the execution of managed code is specified in a CLR format (with its [Common Intermediate Language][cil-spec] (CIL)), and it is the CLR that converts it to run on the native hardware, the CLR has _much_ more control over exactly what that execution does. For example, the CLR could change the meaning of what it means to fetch a field from an object, or call a function. In fact the CLR does exactly this to support the ability to create MarshalByReference objects. These appear to be ordinary local objects, but in fact may exist on another machine. In short, the managed world of the CLR has a large number of _execution hooks_ that it can use to support powerful features that will be explained in more detail in the coming sections.
+The result is that special bookkeeping is needed at every transition to and from managed code. Managed code effectively lives in its own "world" where execution can't enter or leave unless the CLR knows about it. The two worlds are in a very real sense distinct from one another (at any point in time the code is in the _managed world_ or the _unmanaged world_). Moreover, because the execution of managed code is specified in a CLR format (with its [Common Intermediate Language][cil-spec] (CIL)), and it is the CLR that converts it to run on the native hardware, the CLR has _much_ more control over exactly what that execution does. For example, the CLR could change the meaning of what it means to fetch a field from an object, or call a function. In fact the CLR does exactly this to support the ability to create MarshalByReference objects. These appear to be ordinary local objects, but in fact may exist on another machine. In short, the managed world of the CLR has a large number of _execution hooks_ that it can use to support powerful features that will be explained in more detail in the coming sections.
In addition, there is another important ramification of managed code that may not be so obvious. In the unmanaged world, GC pointers are not allowed (since they can't be tracked), and there is a bookkeeping cost associated with transitioning from managed to unmanaged code. What this means is that while you _can_ call arbitrary unmanaged functions from managed code, it is often not pleasant to do so. Unmanaged methods don't use GC objects in their arguments and return types, which mean that any "objects" or "object handles" that those unmanaged functions create and use need to be explicitly deallocated. This is quite unfortunate. Also these APIs can't take advantage of CLR functionality such as exceptions or inheritance, which means that they tend to have a "mismatched" user experience compared to how the interfaces would have been designed in managed code.
The result of this is that unmanaged interfaces are almost always _wrapped_ before being exposed to managed code developers. For example, when accessing files, you don't use the Win32 CreateFile functions provided by the operating system, but rather the managed System.IO.File class that wraps this functionality. It is in fact extremely rare that unmanaged functionality is exposed to users directly.
-While this wrapping may seem to be "bad" in some way (more code that does not seem do much), it is in fact good because it actually adds quite a bit of value. Remember it was always _possible_ to expose the unmanaged interfaces directly; we _chose_ to wrap the functionality. Why? Because the overarching goal of the runtime is to **make programming easy** , and typically the unmanaged functions are not easy enough. Most often, unmanaged interfaces are _not_ designed with ease of use in mind, but rather are tuned for completeness. Anyone looking at the arguments to CreateFile or CreateProcess would be hard pressed to characterize them as "easy." Luckily, the functionality gets a "facelift" when it enters the managed world, and while this makeover is often very "low tech" (requiring nothing more complex than renaming, simplification, and organizing the functionality), it is also profoundly useful. One of the very important documents created for the CLR is the [Framework Design Guidelines](fx-design-guidelines). This 800+ page document details best practices in making new managed class libraries.
+While this wrapping may seem to be "bad" in some way (more code that does not seem do much), it is in fact good because it actually adds quite a bit of value. Remember it was always _possible_ to expose the unmanaged interfaces directly; we _chose_ to wrap the functionality. Why? Because the overarching goal of the runtime is to **make programming easy** , and typically the unmanaged functions are not easy enough. Most often, unmanaged interfaces are _not_ designed with ease of use in mind, but rather are tuned for completeness. Anyone looking at the arguments to CreateFile or CreateProcess would be hard pressed to characterize them as "easy." Luckily, the functionality gets a "facelift" when it enters the managed world, and while this makeover is often very "low tech" (requiring nothing more complex than renaming, simplification, and organizing the functionality), it is also profoundly useful. One of the very important documents created for the CLR is the [Framework Design Guidelines][fx-design-guidelines]. This 800+ page document details best practices in making new managed class libraries.
Thus, we have now seen that managed code (which is intimately involved with the CLR) differs from unmanaged code in two important ways:
@@ -133,7 +133,7 @@ While the [common intermediate language][cil-spec] (CIL) _does_ have operators t
1. Field-fetch operators (LDFLD, STFLD, LDFLDA) that fetch (read), set, and take the address of a field by name.
2. Array-fetch operators (LDELEM, STELEM, LDELEMA) that fetch, set, and take the address of an array element by index. All arrays include a tag specifying their length. This facilitates an automatic bounds check before each access.
-By using these operators instead of the lower-level (and unsafe) _memory-fetch_ operators in user code, as well as avoiding other unsafe [CIL](cil-spec) operators (e.g., those that allow you to jump to arbitrary, and thus possibly bad locations) one could imagine building a system that is memory-safe, but nothing more. The CLR does not do this, however. Instead the CLR enforces a stronger invariant: type safety.
+By using these operators instead of the lower-level (and unsafe) _memory-fetch_ operators in user code, as well as avoiding other unsafe [CIL][cil-spec] operators (e.g., those that allow you to jump to arbitrary, and thus possibly bad locations) one could imagine building a system that is memory-safe, but nothing more. The CLR does not do this, however. Instead the CLR enforces a stronger invariant: type safety.
For type safety, conceptually each memory allocation is associated with a type. All operators that act on memory locations are also conceptually tagged with the type that for which they are valid. Type safety then requires that memory tagged with a particular type can only undergo operations allowed for that type. Not only does this ensure memory safety (no dangling pointers), it also allows additional guarantees for each individual type.
@@ -260,4 +260,4 @@ Phew! The runtime does a lot! It has taken many pages just to describe _some_ o
[ecma-spec]: http://msdn.microsoft.com/en-us/netframework/aa569283.aspx
[clr]: http://msdn.microsoft.com/en-us/library/8bs2ecf4(VS.71).aspx
[cil-spec]: http://download.microsoft.com/download/7/3/3/733AD403-90B2-4064-A81E-01035A7FE13C/MS%20Partition%20III.pdf
-[fx-design-guidelines]: http://msdn.microsoft.com/en-us/library/ms229042.aspx \ No newline at end of file
+[fx-design-guidelines]: http://msdn.microsoft.com/en-us/library/ms229042.aspx
diff --git a/build.sh b/build.sh
index ed5b0bc73c..61b3cbc66e 100755
--- a/build.sh
+++ b/build.sh
@@ -77,11 +77,17 @@ build_coreclr()
echo Failed to generate native component build project!
exit 1
fi
+
+ # Get the number of processors available to the scheduler
+ # Other techniques such as `nproc` only get the number of
+ # processors available to a single process.
+ NumProc=$(($(getconf _NPROCESSORS_ONLN)+1))
# Build CoreCLR
- echo Executing make $__UnprocessedBuildArgs
- make install -j `nproc` $__UnprocessedBuildArgs
+ echo Executing make install -j $NumProc $__UnprocessedBuildArgs
+
+ make install -j $NumProc $__UnprocessedBuildArgs
if [ $? != 0 ]; then
echo Failed to build coreclr components.
exit 1
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 2822facb71..642e66a9ce 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -16,8 +16,12 @@ else(WIN32)
enable_language(ASM)
# This prevents inclusion of standard C compiler headers
add_compile_options(-nostdinc)
-# This prevents inclusion of standard C++ compiler headers
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdinc++")
+
+if(NOT CLR_CMAKE_PLATFORM_DARWIN)
+ # This prevents inclusion of standard C++ compiler headers
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdinc++")
+endif(NOT CLR_CMAKE_PLATFORM_DARWIN)
+
endif(WIN32)
add_subdirectory(utilcode)
diff --git a/src/coreclr/hosts/coreconsole/coreconsole.cpp b/src/coreclr/hosts/coreconsole/coreconsole.cpp
index 0b6a912c5f..eeb3e04c88 100644
--- a/src/coreclr/hosts/coreconsole/coreconsole.cpp
+++ b/src/coreclr/hosts/coreconsole/coreconsole.cpp
@@ -372,27 +372,20 @@ bool TryRun(const int argc, const wchar_t* argv[], Logger &log, const bool verbo
wchar_t appNiPath[MAX_PATH * 2] = W("");
wchar_t managedAssemblyFullName[MAX_PATH] = W("");
- HMODULE managedExeModule = nullptr;
-
- // Have the OS loader discover the location of the managed exe
- managedExeModule = ::LoadLibraryExW(programPath, NULL, 0);
+ wchar_t* filePart = NULL;
- if (!managedExeModule) {
- log << W("Failed to load: ") << programPath << Logger::endl;
+ if (!::GetFullPathName(programPath, MAX_PATH, appPath, &filePart)) {
+ log << W("Failed to get full path: ") << programPath << Logger::endl;
log << W("Error code: ") << GetLastError() << Logger::endl;
return false;
}
- // If the module was successfully loaded, get the path to where it was found.
- ::GetModuleFileNameW(managedExeModule, managedAssemblyFullName, MAX_PATH);
-
- log << W("Loaded: ") << managedAssemblyFullName << Logger::endl;
+ wcscpy_s(managedAssemblyFullName, appPath);
- wchar_t* filePart = NULL;
-
- ::GetFullPathName(managedAssemblyFullName, MAX_PATH, appPath, &filePart);
*(filePart) = W('\0');
+ log << W("Loading: ") << managedAssemblyFullName << Logger::endl;
+
wcscpy_s(appNiPath, appPath);
wcscat_s(appNiPath, MAX_PATH * 2, W(";"));
wcscat_s(appNiPath, MAX_PATH * 2, appPath);
diff --git a/src/coreclr/hosts/corerun/corerun.cpp b/src/coreclr/hosts/corerun/corerun.cpp
index 42f2773b41..cfae1b1b73 100644
--- a/src/coreclr/hosts/corerun/corerun.cpp
+++ b/src/coreclr/hosts/corerun/corerun.cpp
@@ -399,31 +399,20 @@ bool TryRun(const int argc, const wchar_t* argv[], Logger &log, const bool verbo
wchar_t appNiPath[MAX_PATH * 2] = W("");
wchar_t managedAssemblyFullName[MAX_PATH] = W("");
wchar_t appLocalWinmetadata[MAX_PATH] = W("");
-
- HMODULE managedExeModule = nullptr;
-
- wchar_t fullExePath[MAX_PATH];
- ::GetFullPathName(exeName, MAX_PATH, fullExePath, NULL); // Bizarrely, loading a relative path is failing on Phone OS
-
- // Have the OS loader discover the location of the managed exe
- managedExeModule = ::LoadLibraryExW(fullExePath, NULL, 0);
- if (!managedExeModule) {
- log << W("Failed to load: ") << fullExePath << Logger::endl;
+ wchar_t* filePart = NULL;
+
+ if (!::GetFullPathName(exeName, MAX_PATH, appPath, &filePart)) {
+ log << W("Failed to get full path: ") << exeName << Logger::endl;
log << W("Error code: ") << GetLastError() << Logger::endl;
return false;
}
- // If the module was successfully loaded, get the path to where it was found.
- ::GetModuleFileNameW(managedExeModule, managedAssemblyFullName, MAX_PATH);
-
- log << W("Loaded: ") << managedAssemblyFullName << Logger::endl;
+ wcscpy_s(managedAssemblyFullName, appPath);
- wchar_t* filePart = NULL;
-
- ::GetFullPathName(managedAssemblyFullName, MAX_PATH, appPath, &filePart);
*(filePart) = W('\0');
+ log << W("Loading: ") << managedAssemblyFullName << Logger::endl;
wcscpy_s(appLocalWinmetadata, appPath);
wcscat(appLocalWinmetadata, W("\\WinMetadata"));
diff --git a/src/coreclr/hosts/unixcorerun/corerun.cpp b/src/coreclr/hosts/unixcorerun/corerun.cpp
index 2d5f129398..8d411ebecd 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;
@@ -190,7 +194,7 @@ void AddFilesFromDirectoryToTpaList(const char* directory, std::string& tpaList)
std::string filename(entry->d_name);
// Check if the extension matches the one we are looking for
- size_t extPos = filename.length() - extLength;
+ int extPos = filename.length() - extLength;
if ((extPos <= 0) || (filename.compare(extPos, extLength, ext) != 0))
{
continue;
diff --git a/src/debug/CMakeLists.txt b/src/debug/CMakeLists.txt
index 15444d5986..89e8a75564 100644
--- a/src/debug/CMakeLists.txt
+++ b/src/debug/CMakeLists.txt
@@ -2,7 +2,9 @@ add_subdirectory(daccess)
add_subdirectory(dbgutil)
add_subdirectory(ildbsymlib)
add_subdirectory(ee)
-add_subdirectory(di)
+if(NOT CLR_CMAKE_PLATFORM_DARWIN)
+ add_subdirectory(di)
+endif(NOT CLR_CMAKE_PLATFORM_DARWIN)
if(WIN32)
add_subdirectory(shim)
endif(WIN32)
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/CMakeLists.txt b/src/dlls/CMakeLists.txt
index ba9d25bc17..e08cf7f04f 100644
--- a/src/dlls/CMakeLists.txt
+++ b/src/dlls/CMakeLists.txt
@@ -3,6 +3,8 @@ if(WIN32)
add_subdirectory(mscorrc)
add_subdirectory(dbgshim)
endif(WIN32)
-add_subdirectory(mscordbi)
+if(NOT CLR_CMAKE_PLATFORM_DARWIN)
+ add_subdirectory(mscordbi)
+endif(NOT CLR_CMAKE_PLATFORM_DARWIN)
add_subdirectory(mscordac)
add_subdirectory(mscoree)
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/mscorlib/src/System/Resources/ResourceReader.cs b/src/mscorlib/src/System/Resources/ResourceReader.cs
index 4430ca6328..a811fae194 100644
--- a/src/mscorlib/src/System/Resources/ResourceReader.cs
+++ b/src/mscorlib/src/System/Resources/ResourceReader.cs
@@ -1373,22 +1373,24 @@ namespace System.Resources {
String key;
Object value = null;
- lock (_reader._resCache) {
- key = _reader.AllocateStringForNameIndex(_currentName, out _dataPosition);
- ResourceLocator locator;
- if (_reader._resCache.TryGetValue(key, out locator)) {
- value = locator.Value;
- }
- if (value == null) {
- if (_dataPosition == -1)
- value = _reader.GetValueForNameIndex(_currentName);
- else
- value = _reader.LoadObject(_dataPosition);
- // If enumeration and subsequent lookups happen very
- // frequently in the same process, add a ResourceLocator
- // to _resCache here. But WinForms enumerates and
- // just about everyone else does lookups. So caching
- // here may bloat working set.
+ lock (_reader) { // locks should be taken in the same order as in RuntimeResourceSet.GetObject to avoid deadlock
+ lock (_reader._resCache) {
+ key = _reader.AllocateStringForNameIndex(_currentName, out _dataPosition); // AllocateStringForNameIndex could lock on _reader
+ ResourceLocator locator;
+ if (_reader._resCache.TryGetValue(key, out locator)) {
+ value = locator.Value;
+ }
+ if (value == null) {
+ if (_dataPosition == -1)
+ value = _reader.GetValueForNameIndex(_currentName);
+ else
+ value = _reader.LoadObject(_dataPosition);
+ // If enumeration and subsequent lookups happen very
+ // frequently in the same process, add a ResourceLocator
+ // to _resCache here. But WinForms enumerates and
+ // just about everyone else does lookups. So caching
+ // here may bloat working set.
+ }
}
}
return new DictionaryEntry(key, value);
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..52bbd614cc 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.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.S b/src/pal/src/arch/i386/context.S
new file mode 100644
index 0000000000..440b8f2e21
--- /dev/null
+++ b/src/pal/src/arch/i386/context.S
@@ -0,0 +1,17 @@
+#if defined(_DEBUG)
+ .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
+#endif
diff --git a/src/pal/src/arch/i386/context.cpp b/src/pal/src/arch/i386/context.cpp
index 7b5c1fab0d..d52952e496 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;
@@ -1311,42 +1311,3 @@ DBG_FlushInstructionCache(
// Intel x86 hardware has cache coherency, so nothing needs to be done.
return TRUE;
}
-
-#if _DEBUG && defined(__APPLE__)
-/*++
-Function:
- DBG_CheckStackAlignment
-
- The Apple ABI requires 16-byte alignment on the stack pointer.
- This function interrupts otherwise.
---*/
-// Bullseye has parsing problems if "asm" comes after VOID
-asm VOID
-DBG_CheckStackAlignment()
-{
-#ifndef __llvm__
-#ifdef _X86_
- // Prolog - at this point we are at aligned - 4 (for the call)
- push ebp // aligned - 8
- mov ebp, esp
- sub esp,STACK_ALIGN_REQ-8 // aligned (or should be)
-#elif defined(_AMD64_)
- // Prolog - at this point we are at aligned - 8 (for the call)
- push rbp // aligned -16
- mov rbp, rsp
-#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 // 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..413fd500b3 100644
--- a/src/pal/src/exception/machexception.cpp
+++ b/src/pal/src/exception/machexception.cpp
@@ -41,7 +41,6 @@ Abstract:
#include <string.h>
#include <unistd.h>
#include <pthread.h>
-#include <architecture/ppc/cframe.h>
#include <dlfcn.h>
#include <mach-o/loader.h>
@@ -735,22 +734,7 @@ static DWORD exception_from_trap_code(
}
switch (*(unsigned *)code)
{
-#if defined(_PPC_)
- case EXC_PPC_OVERFLOW:
- return EXCEPTION_INT_OVERFLOW;
- case EXC_PPC_ZERO_DIVIDE:
- return EXCEPTION_INT_DIVIDE_BY_ZERO;
- case EXC_PPC_FLT_INEXACT:
- return EXCEPTION_FLT_INEXACT_RESULT;
- case EXC_PPC_FLT_ZERO_DIVIDE:
- return EXCEPTION_FLT_DIVIDE_BY_ZERO;
- case EXC_PPC_FLT_UNDERFLOW:
- return EXCEPTION_FLT_UNDERFLOW;
- case EXC_PPC_FLT_OVERFLOW:
- return EXCEPTION_FLT_OVERFLOW;
- case EXC_PPC_FLT_NOT_A_NUMBER:
- return EXCEPTION_ILLEGAL_INSTRUCTION;
-#elif defined(_X86_) || defined(_AMD64_)
+#if defined(_X86_) || defined(_AMD64_)
case EXC_I386_DIV:
return EXCEPTION_INT_DIVIDE_BY_ZERO;
case EXC_I386_INTO:
@@ -768,14 +752,7 @@ static DWORD exception_from_trap_code(
break;
case EXC_SOFTWARE:
-#if defined(_PPC_)
- // Software generated exception; exact exception is in subcode field. Codes 0 - 0xFFFF reserved to hardware; codes 0x10000 - 0x1FFFF reserved for OS emulation.
- if (*(unsigned *)code == EXC_PPC_TRAP)
- {
- return EXCEPTION_BREAKPOINT;
- }
- return EXCEPTION_ILLEGAL_INSTRUCTION;
-#elif defined(_X86_) || defined(_AMD64_)
+#if defined(_X86_) || defined(_AMD64_)
return EXCEPTION_ILLEGAL_INSTRUCTION;
#else
#error Trap code to exception mapping not defined for this architecture
@@ -783,16 +760,7 @@ static DWORD exception_from_trap_code(
// Trace, breakpoint, etc. Details in subcode field.
case EXC_BREAKPOINT:
-#if defined(_PPC_)
- if (*(unsigned *)code == EXC_PPC_TRACE)
- {
- return EXCEPTION_SINGLE_STEP;
- }
- else if (*(unsigned *)code == EXC_PPC_BREAKPOINT)
- {
- return EXCEPTION_BREAKPOINT;
- }
-#elif defined(_X86_) || defined(_AMD64_)
+#if defined(_X86_) || defined(_AMD64_)
if (*(unsigned *)code == EXC_I386_SGL)
{
return EXCEPTION_SINGLE_STEP;
@@ -851,10 +819,7 @@ catch_exception_raise(
mach_msg_type_number_t code_count) // [in] The size of the buffer (in natural-sized units).
{
kern_return_t MachRet;
-#if defined(_PPC_)
- ppc_thread_state_t ThreadState;
- const thread_state_flavor_t ThreadStateFlavor = MACHINE_THREAD_STATE;
-#elif defined(_X86_)
+#if defined(_X86_)
x86_thread_state32_t ThreadState;
const thread_state_flavor_t ThreadStateFlavor = x86_THREAD_STATE32;
#elif defined(_AMD64_)
@@ -1047,47 +1012,7 @@ catch_exception_raise(
#endif // (_X86_ || _AMD64_) && __APPLE__
#endif // CORECLR && _X86_
-#if defined(_PPC_)
- // If we're in single step mode, disable it since we're going to call PAL_DispatchException
- if (ExceptionRecord.ExceptionCode == EXCEPTION_SINGLE_STEP)
- {
- ThreadState.srr1 &= ~0x400UL;
- }
-
- ExceptionRecord.ExceptionFlags = EXCEPTION_IS_SIGNAL;
- ExceptionRecord.ExceptionRecord = NULL;
- ExceptionRecord.ExceptionAddress = (void *)ThreadContext.Iar;
-
- void *FramePointer = (void *) ThreadState.r1;
-
- // Make sure it's naturally aligned
- FramePointer = (void *)((ULONG_PTR)FramePointer - ((ULONG_PTR)FramePointer % 16));
-
- // Move it past the red zone
- FramePointer = (void *)((ULONG_PTR)FramePointer - C_RED_ZONE);
-
- // Put the Context on the stack
- FramePointer = (void *)((ULONG_PTR)FramePointer - sizeof(CONTEXT));
- *(CONTEXT *)FramePointer = ThreadContext;
- ThreadState.r3 = (unsigned)FramePointer;
-
- // Put the exception record on the stack
- FramePointer = (void *)((ULONG_PTR)FramePointer - sizeof(EXCEPTION_RECORD));
- *(EXCEPTION_RECORD *)FramePointer = ExceptionRecord;
- ThreadState.r4 = (unsigned)FramePointer;
-
- // Add room for the args to spill
- FramePointer = (void *)((ULONG_PTR)FramePointer - 2*sizeof(void *));
-
- // Add room for the linking area (24 bytes)
- FramePointer = (void *)((ULONG_PTR)FramePointer - 24);
- *(unsigned *)FramePointer = ThreadState.r1;
-
- // Make the instruction register point to DispatchException
- ThreadState.lr = (unsigned)ThreadState.srr0;
- ThreadState.srr0 =(unsigned) &PAL_DispatchException;
- ThreadState.r1 = (unsigned)FramePointer;
-#elif defined(_X86_)
+#if defined(_X86_)
// If we're in single step mode, disable it since we're going to call PAL_DispatchException
if (ExceptionRecord.ExceptionCode == EXCEPTION_SINGLE_STEP)
{
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/exception/seh-unwind.cpp b/src/pal/src/exception/seh-unwind.cpp
index 5d910fcaef..9cded92fd8 100644
--- a/src/pal/src/exception/seh-unwind.cpp
+++ b/src/pal/src/exception/seh-unwind.cpp
@@ -744,7 +744,7 @@ PAL_RaiseException(
// SEH Personality
//----------------------------------------------------------------------
-#ifdef __LINUX__
+#if defined(__LINUX__) || defined(__APPLE__)
// TODO: Enable these routines for Linux.
EXCEPTION_DISPOSITION
PAL_RunFilter(
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..9fe1791bbe 100644
--- a/src/pal/src/locale/locale.cpp
+++ b/src/pal/src/locale/locale.cpp
@@ -156,6 +156,16 @@ static const struct CalIdPair requiredCalendars[] =
static CFComparisonResult (*s_CFStringCompareWithOptionsAndLocale)(CFStringRef, CFStringRef, CFRange, CFOptionFlags, CFLocaleRef) = NULL;
+static UniChar * ToUniChar(WCHAR *buffer)
+{
+ return (UniChar *) buffer;
+}
+
+static UniChar * ToUniChar(LPCWSTR buffer)
+{
+ return (UniChar *) buffer;
+}
+
/*
* TODO: Callers of this function really should be using weak linking to get values that are 10.5 only
* to do so we need to start building with XCode 3.0 so we have the 10.5 headers. Once that happens
@@ -359,7 +369,7 @@ static CFStringRef CFStringCreateMacFormattedLocaleName(LPCWSTR lpLocaleName)
return NULL;
}
- CFStringAppendCharacters(cfMutableLocaleName, lpLocaleName, PAL_wcslen(lpLocaleName));
+ CFStringAppendCharacters(cfMutableLocaleName, ToUniChar(lpLocaleName), PAL_wcslen(lpLocaleName));
CFStringFindAndReplace(cfMutableLocaleName,
CFSTR("-"),
@@ -848,7 +858,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 +1564,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 +1624,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, ToUniChar(lpFormat), PAL_wcslen(lpFormat));
if (cfStringFormat == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -1645,7 +1655,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 +1955,13 @@ CompareStringHelper(
cchCount2 = PAL_wcslen( lpString2 );
}
- cfString1 = CFStringCreateWithCharacters(kCFAllocatorDefault, lpString1, cchCount1);
+ cfString1 = CFStringCreateWithCharacters(kCFAllocatorDefault, ToUniChar(lpString1), cchCount1);
if (cfString1 == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto EXIT;
}
- cfString2 = CFStringCreateWithCharacters(kCFAllocatorDefault, lpString2, cchCount2);
+ cfString2 = CFStringCreateWithCharacters(kCFAllocatorDefault, ToUniChar(lpString2), cchCount2);
if (cfString2 == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -3841,7 +3851,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 +4191,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 +4375,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 +4524,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 +4671,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 +4926,7 @@ LCMapStringHelper(
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto EXIT;
}
- CFStringAppendCharacters(cfMutableString, lpSrcStr, cchSrc);
+ CFStringAppendCharacters(cfMutableString, ToUniChar(lpSrcStr), cchSrc);
switch (dwMapFlags)
{
@@ -4959,7 +4969,7 @@ LCMapStringHelper(
}
else
{
- CFStringGetCharacters(cfMutableString, CFRangeMake(0, nRetval), lpDestStr);
+ CFStringGetCharacters(cfMutableString, CFRangeMake(0, nRetval), (UniChar*)lpDestStr);
}
}
@@ -5085,7 +5095,7 @@ PAL_NormalizeStringExW(
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto EXIT;
}
- CFStringAppendCharacters(cfMutableString, lpSrcStr, cchSrc);
+ CFStringAppendCharacters(cfMutableString, ToUniChar(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 +5124,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 +5190,14 @@ PAL_ParseDateW(
goto EXIT;
}
- cfFormat = CFStringCreateWithCharacters(kCFAllocatorDefault, lpFormat, PAL_wcslen(lpFormat));
+ cfFormat = CFStringCreateWithCharacters(kCFAllocatorDefault, ToUniChar(lpFormat), PAL_wcslen(lpFormat));
if (cfFormat == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto EXIT;
}
- cfString = CFStringCreateWithCharacters(kCFAllocatorDefault, lpString, PAL_wcslen(lpString));
+ cfString = CFStringCreateWithCharacters(kCFAllocatorDefault, ToUniChar(lpString), PAL_wcslen(lpString));
if (cfString == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -5208,7 +5218,7 @@ PAL_ParseDateW(
CFDateFormatterSetFormat(cfFormatter,cfFormat);
// Does format contain 'Z'
- cfFormatString = CFStringCreateWithCharacters(kCFAllocatorDefault, lpFormat, PAL_wcslen(lpFormat));
+ cfFormatString = CFStringCreateWithCharacters(kCFAllocatorDefault, ToUniChar(lpFormat), PAL_wcslen(lpFormat));
if (cfFormatString == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -5319,7 +5329,7 @@ PAL_FormatDateW(
goto EXIT;
}
- cfFormat = CFStringCreateWithCharacters(kCFAllocatorDefault, lpFormat, PAL_wcslen(lpFormat));
+ cfFormat = CFStringCreateWithCharacters(kCFAllocatorDefault, ToUniChar(lpFormat), PAL_wcslen(lpFormat));
if (cfFormat == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -5482,7 +5492,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 +5733,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, ToUniChar(sPropertyValue), PAL_wcslen(sPropertyValue));
if (cfPropertyValue == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -5761,11 +5771,11 @@ static BOOL CFNumberFormatterAdjust(CFNumberFormatterRef formatter, LPCSTR forma
case ' ': CFStringAppend(sFormat,CFSTR(" ")); break;
case '-':
if(sMinus)
- CFStringAppendCharacters(sFormat,sMinus,PAL_wcslen(sMinus));
+ CFStringAppendCharacters(sFormat,ToUniChar(sMinus),PAL_wcslen(sMinus));
break;
case '$':
if(sDollar)
- CFStringAppendCharacters(sFormat,sDollar,PAL_wcslen(sDollar));
+ CFStringAppendCharacters(sFormat,ToUniChar(sDollar),PAL_wcslen(sDollar));
break;
default:
@@ -5822,7 +5832,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/src/safecrt/output.inl b/src/pal/src/safecrt/output.inl
index 934c98c407..dd5d1ff40c 100644
--- a/src/pal/src/safecrt/output.inl
+++ b/src/pal/src/safecrt/output.inl
@@ -195,7 +195,7 @@ int __cdecl _swoutput_s(wchar_t *_Dst, size_t _Size, const wchar_t *_Format, va_
CASSERT(sizeof(long) == sizeof(int));
#endif
-#if (defined(__DARWIN_LONG_DOUBLE_IS_DOUBLE) && !__DARWIN_LONG_DOUBLE_IS_DOUBLE) || defined(__LINUX__)
+#if (defined(__DARWIN_LONG_DOUBLE_IS_DOUBLE) && !__DARWIN_LONG_DOUBLE_IS_DOUBLE) || defined(__LINUX__) || defined(__APPLE__)
#ifdef MBUSAFECRT_SUPPORTS_LONGDOUBLE // we do not have _cldcvt function to convert long double.
#define LONGDOUBLE_IS_DOUBLE 0 /* 1 means long double is same as double */
CASSERT(sizeof(long double) != sizeof(double));
diff --git a/src/pal/src/safecrt/safecrt_output_l.c b/src/pal/src/safecrt/safecrt_output_l.c
index 437b06e11b..d2536dca33 100644
--- a/src/pal/src/safecrt/safecrt_output_l.c
+++ b/src/pal/src/safecrt/safecrt_output_l.c
@@ -124,7 +124,7 @@ extern "C"
CASSERT(sizeof(long) == sizeof(int));
#endif
-#if (defined(__DARWIN_LONG_DOUBLE_IS_DOUBLE) && !__DARWIN_LONG_DOUBLE_IS_DOUBLE) || defined(__LINUX__)
+#if (defined(__DARWIN_LONG_DOUBLE_IS_DOUBLE) && !__DARWIN_LONG_DOUBLE_IS_DOUBLE) || defined(__LINUX__) || defined(__APPLE__)
#ifdef MBUSAFECRT_SUPPORTS_LONGDOUBLE // we do not have _cldcvt function to convert long double.
#define LONGDOUBLE_IS_DOUBLE 0 /* 1 means long double is same as double */
CASSERT(sizeof(long double) != sizeof(double));
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..b5c0ba6787 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, NoHandler
//
// 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, NoHandler
// 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..240d455254 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, NoHandler
- 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