Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convert System.Globalization unix calls to QCalls into coreclr #32132

Merged
merged 16 commits into from
Feb 19, 2020
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ set(CORECLR_LIBRARIES
ildbsymlib
utilcode
v3binder
libraries-native
)

if(CLR_CMAKE_TARGET_WIN32)
Expand Down
13 changes: 12 additions & 1 deletion src/coreclr/src/libraries-native/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(GLOBALIZATION_NATIVE_DIR ${CLR_REPO_ROOT_DIR}/src/libraries/Native/Unix/System.Globalization.Native)

if(CLR_CMAKE_HOST_UNIX AND NOT CLR_CROSS_COMPONENTS_BUILD)
add_subdirectory(${CLR_REPO_ROOT_DIR}/src/libraries/Native/Unix/System.Globalization.Native System.Globalization.Native)
include_directories("${CLR_REPO_ROOT_DIR}/src/libraries/Native/Unix/Common")
include_directories("${GLOBALIZATION_NATIVE_DIR}")

add_definitions(-DFEATURE_GLOBALIZATION)
safern marked this conversation as resolved.
Show resolved Hide resolved

add_subdirectory(${GLOBALIZATION_NATIVE_DIR} System.Globalization.Native)
endif()

add_library(libraries-native
STATIC
entrypoints.c
)
80 changes: 80 additions & 0 deletions src/coreclr/src/libraries-native/entrypoints.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

#ifndef __LIB_NATIVE_ENTRYPOINTS
#define __LIB_NATIVE_ENTRYPOINTS
#endif

#ifdef FEATURE_GLOBALIZATION
#include "pal_calendarData.h"
#include "pal_casing.h"
#include "pal_collation.h"
#include "pal_locale.h"
#include "pal_localeNumberData.h"
#include "pal_localeStringData.h"
#include "pal_icushim.h"
#include "pal_idna.h"
#include "pal_normalization.h"
#include "pal_timeZoneInfo.h"
#endif // FEATURE_GLOBALIZATION

#ifndef BYTE
typedef unsigned char BYTE;
#endif

#ifndef LPVOID
typedef void *LPVOID;
#endif

#define FCFuncStart(name) extern const LPVOID name[]; const LPVOID name[] = {
safern marked this conversation as resolved.
Show resolved Hide resolved
#define FCFuncEnd() (BYTE*)0x01 /* FCFuncFlag_EndOfArray */ };
safern marked this conversation as resolved.
Show resolved Hide resolved

#define QCFuncElement(name,impl) \
(BYTE*)0x8 /* FCFuncFlag_QCall */, (LPVOID)(impl), (LPVOID)name,

#if defined(__cplusplus)
safern marked this conversation as resolved.
Show resolved Hide resolved
extern "C" {
#endif // defined(__cplusplus)

#ifdef FEATURE_GLOBALIZATION
FCFuncStart(gPalGlobalizationNative)
QCFuncElement("ChangeCase", GlobalizationNative_ChangeCase)
QCFuncElement("ChangeCaseInvariant", GlobalizationNative_ChangeCaseInvariant)
QCFuncElement("ChangeCaseTurkish", GlobalizationNative_ChangeCaseTurkish)
QCFuncElement("CloseSortHandle", GlobalizationNative_CloseSortHandle)
QCFuncElement("CompareString", GlobalizationNative_CompareString)
QCFuncElement("CompareStringOrdinalIgnoreCase", GlobalizationNative_CompareStringOrdinalIgnoreCase)
QCFuncElement("EndsWith", GlobalizationNative_EndsWith)
QCFuncElement("EnumCalendarInfo", GlobalizationNative_EnumCalendarInfo)
QCFuncElement("GetCalendarInfo", GlobalizationNative_GetCalendarInfo)
QCFuncElement("GetCalendars", GlobalizationNative_GetCalendars)
QCFuncElement("GetDefaultLocaleName", GlobalizationNative_GetDefaultLocaleName)
QCFuncElement("GetJapaneseEraStartDate", GlobalizationNative_GetJapaneseEraStartDate)
QCFuncElement("GetLatestJapaneseEra", GlobalizationNative_GetLatestJapaneseEra)
QCFuncElement("GetLocaleInfoGroupingSizes", GlobalizationNative_GetLocaleInfoGroupingSizes)
QCFuncElement("GetLocaleInfoInt", GlobalizationNative_GetLocaleInfoInt)
QCFuncElement("GetLocaleInfoString", GlobalizationNative_GetLocaleInfoString)
QCFuncElement("GetLocaleName", GlobalizationNative_GetLocaleName)
QCFuncElement("GetLocales", GlobalizationNative_GetLocales)
QCFuncElement("GetLocaleTimeFormat", GlobalizationNative_GetLocaleTimeFormat)
QCFuncElement("GetSortHandle", GlobalizationNative_GetSortHandle)
QCFuncElement("GetSortKey", GlobalizationNative_GetSortKey)
QCFuncElement("GetSortVersion", GlobalizationNative_GetSortVersion)
QCFuncElement("GetTimeZoneDisplayName", GlobalizationNative_GetTimeZoneDisplayName)
QCFuncElement("IndexOf", GlobalizationNative_IndexOf)
QCFuncElement("IndexOfOrdinalIgnoreCase", GlobalizationNative_IndexOfOrdinalIgnoreCase)
QCFuncElement("IsNormalized", GlobalizationNative_IsNormalized)
QCFuncElement("IsPredefinedLocale", GlobalizationNative_IsPredefinedLocale)
QCFuncElement("LastIndexOf", GlobalizationNative_LastIndexOf)
QCFuncElement("LoadICU", GlobalizationNative_LoadICU)
QCFuncElement("NormalizeString", GlobalizationNative_NormalizeString)
QCFuncElement("StartsWith", GlobalizationNative_StartsWith)
QCFuncElement("ToAscii", GlobalizationNative_ToAscii)
QCFuncElement("ToUnicode", GlobalizationNative_ToUnicode)
FCFuncEnd()
#endif // FEATURE_GLOBALIZATION

#if defined(__cplusplus)
}
#endif // defined(__cplusplus)
5 changes: 5 additions & 0 deletions src/coreclr/src/vm/ecalllist.h
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,11 @@ FCClassElement("FileLoadException", "System.IO", gFileLoadExceptionFuncs)
FCClassElement("GC", "System", gGCInterfaceFuncs)
FCClassElement("GCHandle", "System.Runtime.InteropServices", gGCHandleFuncs)
FCClassElement("GCSettings", "System.Runtime", gGCSettingsFuncs)
#ifdef TARGET_UNIX
#ifndef CROSSGEN_COMPILE
FCClassElement("Globalization", "", gPalGlobalizationNative)
#endif
#endif
#ifdef FEATURE_COMINTEROP
FCClassElement("IEnumerable", "System.Collections", gStdMngIEnumerableFuncs)
FCClassElement("IEnumerator", "System.Collections", gStdMngIEnumeratorFuncs)
Expand Down
7 changes: 3 additions & 4 deletions src/coreclr/src/vm/mscorlib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -367,15 +367,14 @@ const MscorlibFieldDescription c_rgMscorlibFieldDescriptions[] =
};
const USHORT c_nMscorlibFieldDescriptions = NumItems(c_rgMscorlibFieldDescriptions) + 1;





///////////////////////////////////////////////////////////////////////////////
//
// ECalls
//

// ECalls defined by libraries-native shims
EXTERN_C const LPVOID gPalGlobalizationNative[];

// When compiling crossgen, we only need the target version of the ecall tables
#if !defined(CROSSGEN_COMPILE) || defined(CROSSGEN_MSCORLIB)

Expand Down
8 changes: 7 additions & 1 deletion src/libraries/Common/src/Interop/Unix/Interop.Libraries.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,23 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Runtime.CompilerServices;
safern marked this conversation as resolved.
Show resolved Hide resolved

internal static partial class Interop
{
internal static partial class Libraries
{
// Shims
internal const string SystemNative = "System.Native";
internal const string GlobalizationNative = "System.Globalization.Native";
internal const string NetSecurityNative = "System.Net.Security.Native";
internal const string CryptoNative = "System.Security.Cryptography.Native.OpenSsl";
internal const string CompressionNative = "System.IO.Compression.Native";
internal const string IOPortsNative = "System.IO.Ports.Native";
internal const string Libdl = "libdl";
#if CORECLR
safern marked this conversation as resolved.
Show resolved Hide resolved
internal const string GlobalizationNative = RuntimeHelpers.QCall;
#else
internal const string GlobalizationNative = "System.Globalization.Native";
#endif
}
}
2 changes: 1 addition & 1 deletion src/libraries/Native/Unix/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
set(CMAKE_SHARED_LIBRARY_PREFIX "")
set(VERSION_FILE_PATH "${CMAKE_BINARY_DIR}/version.c")

# We mark the function which needs exporting with DLLEXPORT
# We mark the function which needs exporting with PALEXPORT
add_compile_options(-fvisibility=hidden)

add_compile_options(-Wno-format-nonliteral)
Expand Down
6 changes: 5 additions & 1 deletion src/libraries/Native/Unix/Common/pal_compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,8 @@
#define c_static_assert(e) c_static_assert_msg(e, "")
#endif

#define DLLEXPORT __attribute__ ((__visibility__ ("default")))
#ifdef __LIB_NATIVE_ENTRYPOINTS
#define PALEXPORT __attribute__ ((__visibility__ ("hidden")))
safern marked this conversation as resolved.
Show resolved Hide resolved
#else
#define PALEXPORT __attribute__ ((__visibility__ ("default")))
#endif // __LIB_NATIVE_ENTRYPOINTS
Original file line number Diff line number Diff line change
Expand Up @@ -68,25 +68,25 @@ typedef enum
// the function pointer definition for the callback used in EnumCalendarInfo
typedef void (*EnumCalendarInfoCallback)(const UChar*, const void*);

DLLEXPORT int32_t GlobalizationNative_GetCalendars(const UChar* localeName,
PALEXPORT int32_t GlobalizationNative_GetCalendars(const UChar* localeName,
CalendarId* calendars,
int32_t calendarsCapacity);

DLLEXPORT ResultCode GlobalizationNative_GetCalendarInfo(const UChar* localeName,
PALEXPORT ResultCode GlobalizationNative_GetCalendarInfo(const UChar* localeName,
CalendarId calendarId,
CalendarDataType dataType,
UChar* result,
int32_t resultCapacity);

DLLEXPORT int32_t GlobalizationNative_EnumCalendarInfo(EnumCalendarInfoCallback callback,
PALEXPORT int32_t GlobalizationNative_EnumCalendarInfo(EnumCalendarInfoCallback callback,
const UChar* localeName,
CalendarId calendarId,
CalendarDataType dataType,
const void* context);

DLLEXPORT int32_t GlobalizationNative_GetLatestJapaneseEra(void);
PALEXPORT int32_t GlobalizationNative_GetLatestJapaneseEra(void);

DLLEXPORT int32_t GlobalizationNative_GetJapaneseEraStartDate(int32_t era,
PALEXPORT int32_t GlobalizationNative_GetJapaneseEraStartDate(int32_t era,
int32_t* startYear,
int32_t* startMonth,
int32_t* startDay);
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@
#include "pal_compiler.h"
#include "pal_locale.h"

DLLEXPORT void GlobalizationNative_ChangeCase(const UChar* lpSrc,
PALEXPORT void GlobalizationNative_ChangeCase(const UChar* lpSrc,
int32_t cwSrcLength,
UChar* lpDst,
int32_t cwDstLength,
int32_t bToUpper);

DLLEXPORT void GlobalizationNative_ChangeCaseInvariant(const UChar* lpSrc,
PALEXPORT void GlobalizationNative_ChangeCaseInvariant(const UChar* lpSrc,
int32_t cwSrcLength,
UChar* lpDst,
int32_t cwDstLength,
int32_t bToUpper);

DLLEXPORT void GlobalizationNative_ChangeCaseTurkish(const UChar* lpSrc,
PALEXPORT void GlobalizationNative_ChangeCaseTurkish(const UChar* lpSrc,
int32_t cwSrcLength,
UChar* lpDst,
int32_t cwDstLength,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,62 +8,62 @@

typedef struct SortHandle SortHandle;

DLLEXPORT ResultCode GlobalizationNative_GetSortHandle(const char* lpLocaleName, SortHandle** ppSortHandle);
PALEXPORT ResultCode GlobalizationNative_GetSortHandle(const char* lpLocaleName, SortHandle** ppSortHandle);

DLLEXPORT void GlobalizationNative_CloseSortHandle(SortHandle* pSortHandle);
PALEXPORT void GlobalizationNative_CloseSortHandle(SortHandle* pSortHandle);

DLLEXPORT int32_t GlobalizationNative_GetSortVersion(SortHandle* pSortHandle);
PALEXPORT int32_t GlobalizationNative_GetSortVersion(SortHandle* pSortHandle);

DLLEXPORT int32_t GlobalizationNative_CompareString(SortHandle* pSortHandle,
PALEXPORT int32_t GlobalizationNative_CompareString(SortHandle* pSortHandle,
const UChar* lpStr1,
int32_t cwStr1Length,
const UChar* lpStr2,
int32_t cwStr2Length,
int32_t options);

DLLEXPORT int32_t GlobalizationNative_IndexOf(SortHandle* pSortHandle,
PALEXPORT int32_t GlobalizationNative_IndexOf(SortHandle* pSortHandle,
const UChar* lpTarget,
int32_t cwTargetLength,
const UChar* lpSource,
int32_t cwSourceLength,
int32_t options,
int32_t* pMatchedLength);

DLLEXPORT int32_t GlobalizationNative_LastIndexOf(SortHandle* pSortHandle,
PALEXPORT int32_t GlobalizationNative_LastIndexOf(SortHandle* pSortHandle,
const UChar* lpTarget,
int32_t cwTargetLength,
const UChar* lpSource,
int32_t cwSourceLength,
int32_t options);

DLLEXPORT int32_t GlobalizationNative_IndexOfOrdinalIgnoreCase(const UChar* lpTarget,
PALEXPORT int32_t GlobalizationNative_IndexOfOrdinalIgnoreCase(const UChar* lpTarget,
int32_t cwTargetLength,
const UChar* lpSource,
int32_t cwSourceLength,
int32_t findLast);

DLLEXPORT int32_t GlobalizationNative_StartsWith(SortHandle* pSortHandle,
PALEXPORT int32_t GlobalizationNative_StartsWith(SortHandle* pSortHandle,
const UChar* lpTarget,
int32_t cwTargetLength,
const UChar* lpSource,
int32_t cwSourceLength,
int32_t options);

DLLEXPORT int32_t GlobalizationNative_EndsWith(SortHandle* pSortHandle,
PALEXPORT int32_t GlobalizationNative_EndsWith(SortHandle* pSortHandle,
const UChar* lpTarget,
int32_t cwTargetLength,
const UChar* lpSource,
int32_t cwSourceLength,
int32_t options);

DLLEXPORT int32_t GlobalizationNative_GetSortKey(SortHandle* pSortHandle,
PALEXPORT int32_t GlobalizationNative_GetSortKey(SortHandle* pSortHandle,
const UChar* lpStr,
int32_t cwStrLength,
uint8_t* sortKey,
int32_t cbSortKeyLength,
int32_t options);

DLLEXPORT int32_t GlobalizationNative_CompareStringOrdinalIgnoreCase(const UChar* lpStr1,
PALEXPORT int32_t GlobalizationNative_CompareStringOrdinalIgnoreCase(const UChar* lpStr1,
int32_t cwStr1Length,
const UChar* lpStr2,
int32_t cwStr2Length);
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ typedef enum
OutOfMemory = 3
} ResultCode;

// if defined we're building the qcalls entrypoints which don't include ICU headers
#ifndef __LIB_NATIVE_ENTRYPOINTS

/*
Converts a UErrorCode to a ResultCode.
*/
Expand All @@ -40,3 +43,5 @@ static ResultCode GetResultCode(UErrorCode err)

return UnknownError;
}

#endif // ifndef __LIB_NATIVE_ENTRYPOINTS
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@

#pragma once

// if defined we're building the qcalls entrypoints and we don't need to include icu or config headers
safern marked this conversation as resolved.
Show resolved Hide resolved
#ifndef __LIB_NATIVE_ENTRYPOINTS
#include "config.h"
#include "pal_compiler.h"

#define U_DISABLE_RENAMING 1

Expand Down Expand Up @@ -240,6 +241,16 @@ FOR_ALL_ICU_FUNCTIONS
#define usearch_last(...) usearch_last_ptr(__VA_ARGS__)
#define usearch_openFromCollator(...) usearch_openFromCollator_ptr(__VA_ARGS__)

DLLEXPORT int32_t GlobalizationNative_LoadICU(void);
#endif // ifndef __LIB_NATIVE_ENTRYPOINTS

#ifdef __LIB_NATIVE_ENTRYPOINTS
#ifndef UChar
typedef uint16_t UChar;
#endif // ifndef UChar
#endif // ifdef __LIB_NATIVE_ENTRYPOINTS

#include "pal_compiler.h"

PALEXPORT int32_t GlobalizationNative_LoadICU(void);

DLLEXPORT int32_t GlobalizationNative_GetICUVersion(void);
PALEXPORT int32_t GlobalizationNative_GetICUVersion(void);
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
#include "pal_compiler.h"
#include "pal_locale.h"

DLLEXPORT int32_t GlobalizationNative_ToAscii(uint32_t flags,
PALEXPORT int32_t GlobalizationNative_ToAscii(uint32_t flags,
const UChar* lpSrc,
int32_t cwSrcLength,
UChar* lpDst,
int32_t cwDstLength);

DLLEXPORT int32_t GlobalizationNative_ToUnicode(uint32_t flags,
PALEXPORT int32_t GlobalizationNative_ToUnicode(uint32_t flags,
const UChar* lpSrc,
int32_t cwSrcLength,
UChar* lpDst,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

#include "pal_icushim.h"

// if defined we're building the qcalls entrypoints which don't include ICU headers
#ifndef __LIB_NATIVE_ENTRYPOINTS
safern marked this conversation as resolved.
Show resolved Hide resolved

/*
Function:
UErrorCodeToBool
Expand Down Expand Up @@ -51,10 +54,12 @@ we can't compute one (different from uloc_getDefault()) would do.
*/
const char* DetectDefaultLocaleName(void);

DLLEXPORT int32_t GlobalizationNative_GetLocales(UChar *value, int32_t valueLength);
#endif // ifndef __LIB_NATIVE_ENTRYPOINTS

PALEXPORT int32_t GlobalizationNative_GetLocales(UChar *value, int32_t valueLength);

DLLEXPORT int32_t GlobalizationNative_GetLocaleName(const UChar* localeName, UChar* value, int32_t valueLength);
PALEXPORT int32_t GlobalizationNative_GetLocaleName(const UChar* localeName, UChar* value, int32_t valueLength);

DLLEXPORT int32_t GlobalizationNative_GetDefaultLocaleName(UChar* value, int32_t valueLength);
PALEXPORT int32_t GlobalizationNative_GetDefaultLocaleName(UChar* value, int32_t valueLength);

DLLEXPORT int32_t GlobalizationNative_IsPredefinedLocale(const UChar* localeName);
PALEXPORT int32_t GlobalizationNative_IsPredefinedLocale(const UChar* localeName);
Loading