diff options
author | Jiyoung Yun <jy910.yun@samsung.com> | 2017-02-10 11:35:12 (GMT) |
---|---|---|
committer | Jiyoung Yun <jy910.yun@samsung.com> | 2017-02-10 11:35:12 (GMT) |
commit | 4b11dc566a5bbfa1378d6266525c281b028abcc8 (patch) | |
tree | b48831a898906734f8884d08b6e18f1144ee2b82 /src/pal | |
parent | db20f3f1bb8595633a7e16c8900fd401a453a6b5 (diff) | |
download | coreclr-4b11dc566a5bbfa1378d6266525c281b028abcc8.zip coreclr-4b11dc566a5bbfa1378d6266525c281b028abcc8.tar.gz coreclr-4b11dc566a5bbfa1378d6266525c281b028abcc8.tar.bz2 |
Imported Upstream version 1.0.0.9910upstream/1.0.0.9910
Diffstat (limited to 'src/pal')
1173 files changed, 1830 insertions, 7758 deletions
diff --git a/src/pal/CMakeLists.txt b/src/pal/CMakeLists.txt index cb8b055..8e3228b 100644 --- a/src/pal/CMakeLists.txt +++ b/src/pal/CMakeLists.txt @@ -5,7 +5,7 @@ project(COREPAL) if (WIN32) set(FEATURE_EVENT_TRACE 1) endif() -if(CLR_CMAKE_PLATFORM_LINUX AND CLR_CMAKE_PLATFORM_ARCH_AMD64) +if(CLR_CMAKE_PLATFORM_LINUX AND CLR_CMAKE_TARGET_ARCH_AMD64) set(FEATURE_EVENT_TRACE 1) endif() diff --git a/src/pal/inc/mbusafecrt.h b/src/pal/inc/mbusafecrt.h index 8cf050f..f030b7d 100644 --- a/src/pal/inc/mbusafecrt.h +++ b/src/pal/inc/mbusafecrt.h @@ -56,7 +56,7 @@ extern WCHAR* wcstok_s( WCHAR* inString, const WCHAR* inControl, WCHAR** ioConte // strnlen is not required unless the source string is completely untrusted (e.g. anonymous input on a website) #ifndef SUPPRESS_STRNLEN extern size_t PAL_strnlen( const char* inString, size_t inMaxSize ); - extern size_t wcsnlen( const WCHAR* inString, size_t inMaxSize ); + extern size_t PAL_wcsnlen( const WCHAR* inString, size_t inMaxSize ); #endif extern errno_t _itoa_s( int inValue, char* outBuffer, size_t inDestBufferSize, int inRadix ); diff --git a/src/pal/inc/pal.h b/src/pal/inc/pal.h index 0d7c89e..d0b78e9 100644 --- a/src/pal/inc/pal.h +++ b/src/pal/inc/pal.h @@ -50,7 +50,6 @@ Abstract: extern "C" { #endif -#if defined (PLATFORM_UNIX) // This macro is used to standardize the wide character string literals between UNIX and Windows. // Unix L"" is UTF32, and on windows it's UTF16. Because of built-in assumptions on the size // of string literals, it's important to match behaviour between Unix and Windows. Unix will be defined @@ -65,8 +64,6 @@ extern "C" { #define QUOTE_MACRO_u_HELPER(x) u###x #define QUOTE_MACRO_u(x) QUOTE_MACRO_u_HELPER(x) -#endif - #include <pal_char16.h> #include <pal_error.h> #include <pal_mstypes.h> @@ -83,16 +80,6 @@ extern "C" { #define _M_IX86 400 #elif defined(__i386__) && !defined(_M_IX86) #define _M_IX86 300 -#elif defined(__ppc__) && !defined(_M_PPC) -#define _M_PPC 100 -#elif defined(_AIX) && defined(_POWER) && !defined(_M_PPC) -#define _M_PPC 100 -#elif defined(__sparc__) && !defined(_M_SPARC) -#define _M_SPARC 100 -#elif defined(__hppa__) && !defined(_M_PARISC) -#define _M_PARISC 100 -#elif defined(__ia64__) && !defined(_M_IA64) -#define _M_IA64 64100 #elif defined(__x86_64__) && !defined(_M_AMD64) #define _M_AMD64 100 #elif defined(__arm__) && !defined(_M_ARM) @@ -103,20 +90,6 @@ extern "C" { #if defined(_M_IX86) && !defined(_X86_) #define _X86_ -#elif defined(_M_ALPHA) && !defined(_ALPHA_) -#define _ALPHA_ -#elif defined(_M_PPC) && !defined(_PPC_) -#define _PPC_ -#elif defined(_M_SPARC) && !defined(_SPARC_) -#define _SPARC_ -#elif defined(_M_PARISC) && !defined(_PARISC_) -#define _PARISC_ -#elif defined(_M_MRX000) && !defined(_MIPS_) -#define _MIPS_ -#elif defined(_M_M68K) && !defined(_68K_) -#define _68K_ -#elif defined(_M_IA64) && !defined(_IA64_) -#define _IA64_ #elif defined(_M_AMD64) && !defined(_AMD64_) #define _AMD64_ #elif defined(_M_ARM) && !defined(_ARM_) @@ -129,10 +102,6 @@ extern "C" { /******************* ABI-specific glue *******************************/ -#if defined(_PPC_) || defined(_PPC64_) || defined(_SPARC_) || defined(_PARISC_) || defined(_IA64_) -#define BIGENDIAN 1 -#endif - #ifdef __APPLE__ // Both PowerPC, i386 and x86_64 on Mac OS X use 16-byte alignment. #define STACK_ALIGN_BITS 4 @@ -191,19 +160,7 @@ extern "C" { #define __annotation(x) #endif //!MSC_VER -#ifdef _MSC_VER - -#if defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64) -#define UNALIGNED __unaligned -#else #define UNALIGNED -#endif - -#else // _MSC_VER - -#define UNALIGNED - -#endif // _MSC_VER #ifndef FORCEINLINE #if _MSC_VER < 1200 @@ -215,75 +172,19 @@ extern "C" { #ifndef PAL_STDCPP_COMPAT -#ifdef _M_ALPHA +#if __GNUC__ -typedef struct { - char *a0; /* pointer to first homed integer argument */ - int offset; /* byte offset of next parameter */ -} va_list; - -#define va_start(list, v) __builtin_va_start(list, v, 1) -#define va_end(list) - -#elif __GNUC__ - -#if defined(_AIX) - -typedef __builtin_va_list __gnuc_va_list; typedef __builtin_va_list va_list; -#define va_start(v,l) __builtin_va_start(v,l) -#define va_end __builtin_va_end -#define va_arg __builtin_va_arg - -#else // _AIX - -#if __GNUC__ == 2 -typedef void * va_list; -#else -typedef __builtin_va_list va_list; -#endif // __GNUC__ /* We should consider if the va_arg definition here is actually necessary. Could we use the standard va_arg definition? */ -#if __GNUC__ == 2 -#if defined(_SPARC_) || defined(_PARISC_) // ToDo: is this the right thing for PARISC? -#define va_start(list, v) (__builtin_next_arg(v), list = (char *) __builtin_saveregs()) -#define __va_rounded_size(TYPE) \ - (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) -#define __record_type_class 12 -#define __real_type_class 8 -#define va_arg(pvar,TYPE) \ -__extension__ \ -(*({((__builtin_classify_type (*(TYPE*) 0) >= __record_type_class \ - || (__builtin_classify_type (*(TYPE*) 0) == __real_type_class \ - && sizeof (TYPE) == 16)) \ - ? ((pvar) = (char *)(pvar) + __va_rounded_size (TYPE *), \ - *(TYPE **) (void *) ((char *)(pvar) - __va_rounded_size (TYPE *))) \ - : __va_rounded_size (TYPE) == 8 \ - ? ({ union {char __d[sizeof (TYPE)]; int __i[2];} __u; \ - __u.__i[0] = ((int *) (void *) (pvar))[0]; \ - __u.__i[1] = ((int *) (void *) (pvar))[1]; \ - (pvar) = (char *)(pvar) + 8; \ - (TYPE *) (void *) __u.__d; }) \ - : ((pvar) = (char *)(pvar) + __va_rounded_size (TYPE), \ - ((TYPE *) (void *) ((char *)(pvar) - __va_rounded_size (TYPE)))));})) -#else // _SPARC_ or _PARISC_ -// GCC 2.95.3 on non-SPARC -#define __va_size(type) (((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) -#define va_start(list, v) ((list) = (va_list) __builtin_next_arg(v)) -#define va_arg(ap, type) (*(type *)((ap) += __va_size(type), (ap) - __va_size(type))) -#endif // _SPARC_ or _PARISC_ -#else // __GNUC__ == 2 #define va_start __builtin_va_start #define va_arg __builtin_va_arg -#endif // __GNUC__ == 2 #define va_copy __builtin_va_copy #define va_end __builtin_va_end -#endif // _AIX - #define VOID void #define PUB __attribute__((visibility("default"))) @@ -628,26 +529,6 @@ PAL_Random( IN OUT LPVOID lpBuffer, IN DWORD dwLength); -#ifdef PLATFORM_UNIX - -PALIMPORT -DWORD -PALAPI -PAL_CreateExecWatchpoint( - HANDLE hThread, - PVOID pvInstruction - ); - -PALIMPORT -DWORD -PALAPI -PAL_DeleteExecWatchpoint( - HANDLE hThread, - PVOID pvInstruction - ); - -#endif - PALIMPORT BOOL PALAPI @@ -1845,6 +1726,15 @@ QueueUserAPC( #define CONTEXT_EXCEPTION_REQUEST 0x40000000L #define CONTEXT_EXCEPTION_REPORTING 0x80000000L +// +// This flag is set by the unwinder if it has unwound to a call +// site, and cleared whenever it unwinds through a trap frame. +// It is used by language-specific exception handlers to help +// differentiate exception scopes during dispatching. +// + +#define CONTEXT_UNWOUND_TO_CALL 0x20000000 + typedef struct _FLOATING_SAVE_AREA { DWORD ControlWord; DWORD StatusWord; @@ -1905,658 +1795,21 @@ typedef struct _CONTEXT { typedef struct _KNONVOLATILE_CONTEXT_POINTERS { - // TODO WIP x86/Linux, need to fix this. - PDWORD Ebx; - PDWORD Esi; + // The ordering of these fields should be aligned with that + // of corresponding fields in CONTEXT + // + // (See FillRegDisplay in inc/regdisp.h for details) PDWORD Edi; + PDWORD Esi; + PDWORD Ebx; + PDWORD Edx; + PDWORD Ecx; + PDWORD Eax; + PDWORD Ebp; } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS; -#elif defined(_PPC_) - -// -// *********************************************************************************** -// -// NOTE: These context definitions are replicated in ndp/clr/src/debug/inc/DbgTargetContext.h (for the -// purposes manipulating contexts from different platforms during remote debugging). Be sure to keep those -// definitions in sync if you make any changes here. -// -// *********************************************************************************** -// - -#define CONTEXT_CONTROL 0x00000001L -#define CONTEXT_FLOATING_POINT 0x00000002L -#define CONTEXT_INTEGER 0x00000004L - -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER) -#define CONTEXT_ALL CONTEXT_FULL - -typedef struct _CONTEXT { - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_FLOATING_POINT. - // - - double Fpr0; // Floating registers 0..31 - double Fpr1; - double Fpr2; - double Fpr3; - double Fpr4; - double Fpr5; - double Fpr6; - double Fpr7; - double Fpr8; - double Fpr9; - double Fpr10; - double Fpr11; - double Fpr12; - double Fpr13; - double Fpr14; - double Fpr15; - double Fpr16; - double Fpr17; - double Fpr18; - double Fpr19; - double Fpr20; - double Fpr21; - double Fpr22; - double Fpr23; - double Fpr24; - double Fpr25; - double Fpr26; - double Fpr27; - double Fpr28; - double Fpr29; - double Fpr30; - double Fpr31; - double Fpscr; // Floating point status/control reg - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_INTEGER. - // - - ULONG Gpr0; // General registers 0..31 - ULONG Gpr1; // StackPointer - ULONG Gpr2; - ULONG Gpr3; - ULONG Gpr4; - ULONG Gpr5; - ULONG Gpr6; - ULONG Gpr7; - ULONG Gpr8; - ULONG Gpr9; - ULONG Gpr10; - ULONG Gpr11; - ULONG Gpr12; - ULONG Gpr13; - ULONG Gpr14; - ULONG Gpr15; - ULONG Gpr16; - ULONG Gpr17; - ULONG Gpr18; - ULONG Gpr19; - ULONG Gpr20; - ULONG Gpr21; - ULONG Gpr22; - ULONG Gpr23; - ULONG Gpr24; - ULONG Gpr25; - ULONG Gpr26; - ULONG Gpr27; - ULONG Gpr28; - ULONG Gpr29; - ULONG Gpr30; - ULONG Gpr31; - - ULONG Cr; // Condition register - ULONG Xer; // Fixed point exception register - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_CONTROL. - // - - ULONG Msr; // Machine status register - ULONG Iar; // Instruction address register - ULONG Lr; // Link register - ULONG Ctr; // Count register - - // - // The flags values within this flag control the contents of - // a CONTEXT record. - // - // If the context record is used as an input parameter, then - // for each portion of the context record controlled by a flag - // whose value is set, it is assumed that that portion of the - // context record contains valid context. If the context record - // is being used to modify a thread's context, then only that - // portion of the threads context will be modified. - // - // If the context record is used as an IN OUT parameter to capture - // the context of a thread, then only those portions of the thread's - // context corresponding to set flags will be returned. - // - // The context record is never used as an OUT only parameter. - // - - ULONG ContextFlags; - - ULONG Fill[3]; // Pad out to multiple of 16 bytes - - // - // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is - // set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT - // included in CONTEXT_FULL. - // - ULONG Dr0; // Breakpoint Register 1 - ULONG Dr1; // Breakpoint Register 2 - ULONG Dr2; // Breakpoint Register 3 - ULONG Dr3; // Breakpoint Register 4 - ULONG Dr4; // Breakpoint Register 5 - ULONG Dr5; // Breakpoint Register 6 - ULONG Dr6; // Debug Status Register - ULONG Dr7; // Debug Control Register - -} CONTEXT, *PCONTEXT, *LPCONTEXT; - -#elif defined(_SPARC_) - -#define CONTEXT_CONTROL 0x00000001L -#define CONTEXT_FLOATING_POINT 0x00000002L -#define CONTEXT_INTEGER 0x00000004L - -#define COUNT_FLOATING_REGISTER 32 -#define COUNT_DOUBLE_REGISTER 16 -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER) -#define CONTEXT_ALL CONTEXT_FULL - -typedef struct _CONTEXT { - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_INTEGER. - // - ULONG g0; - ULONG g1; - ULONG g2; - ULONG g3; - ULONG g4; - ULONG g5; - ULONG g6; - ULONG g7; - ULONG o0; - ULONG o1; - ULONG o2; - ULONG o3; - ULONG o4; - ULONG o5; - ULONG sp; - ULONG o7; - ULONG l0; - ULONG l1; - ULONG l2; - ULONG l3; - ULONG l4; - ULONG l5; - ULONG l6; - ULONG l7; - ULONG i0; - ULONG i1; - ULONG i2; - ULONG i3; - ULONG i4; - ULONG i5; - ULONG fp; - ULONG i7; - - ULONG y; - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_CONTROL. - // -#if defined(__sparcv9) - ULONG ccr; -#else - ULONG psr; -#endif - ULONG pc; // program counter - ULONG npc; // next address to be executed - - ULONG ContextFlags; - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_FLOATING_POINT. - // - ULONGLONG fsr; - union { - float f[COUNT_FLOATING_REGISTER]; - double d[COUNT_DOUBLE_REGISTER]; - } fprs; - -} CONTEXT, *PCONTEXT, *LPCONTEXT; - -#elif defined(_PARISC_) - -// ToDo: Get this correct for PARISC architecture -#define CONTEXT_CONTROL 0x00000001L -#define CONTEXT_FLOATING_POINT 0x00000002L -#define CONTEXT_INTEGER 0x00000004L - -#define COUNT_FLOATING_REGISTER 32 -#define COUNT_DOUBLE_REGISTER 16 -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER) -#define CONTEXT_ALL CONTEXT_FULL - -typedef struct _CONTEXT { - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_INTEGER. - // - ULONG g0; - ULONG g1; - ULONG g2; - ULONG g3; - ULONG g4; - ULONG g5; - ULONG g6; - ULONG g7; - ULONG o0; - ULONG o1; - ULONG o2; - ULONG o3; - ULONG o4; - ULONG o5; - ULONG sp; - ULONG o7; - ULONG l0; - ULONG l1; - ULONG l2; - ULONG l3; - ULONG l4; - ULONG l5; - ULONG l6; - ULONG l7; - ULONG i0; - ULONG i1; - ULONG i2; - ULONG i3; - ULONG i4; - ULONG i5; - ULONG fp; - ULONG i7; - - ULONG y; - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_CONTROL. - // - ULONG psr; - ULONG pc; // program counter - ULONG npc; // next address to be executed - - ULONG ContextFlags; - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_FLOATING_POINT. - // - ULONGLONG fsr; - union { - float f[COUNT_FLOATING_REGISTER]; - double d[COUNT_DOUBLE_REGISTER]; - } fprs; - -} CONTEXT, *PCONTEXT, *LPCONTEXT; - -#elif defined(_IA64_) - -// copied from winnt.h -typedef struct _FLOAT128 { - __int64 LowPart; - __int64 HighPart; -} FLOAT128; - -typedef FLOAT128 *PFLOAT128; - -// begin_ntddk begin_nthal - -// -// The following flags control the contents of the CONTEXT structure. -// - -#if !defined(RC_INVOKED) - -#define CONTEXT_IA64 0x00080000 - -#define CONTEXT_CONTROL (CONTEXT_IA64 | 0x00000001L) -#define CONTEXT_LOWER_FLOATING_POINT (CONTEXT_IA64 | 0x00000002L) -#define CONTEXT_HIGHER_FLOATING_POINT (CONTEXT_IA64 | 0x00000004L) -#define CONTEXT_INTEGER (CONTEXT_IA64 | 0x00000008L) -#define CONTEXT_DEBUG (CONTEXT_IA64 | 0x00000010L) -#define CONTEXT_IA32_CONTROL (CONTEXT_IA64 | 0x00000020L) // Includes StIPSR - - -#define CONTEXT_FLOATING_POINT (CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT) -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_IA32_CONTROL) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_DEBUG | CONTEXT_IA32_CONTROL) - -#define CONTEXT_EXCEPTION_ACTIVE 0x8000000 -#define CONTEXT_SERVICE_ACTIVE 0x10000000 -#define CONTEXT_EXCEPTION_REQUEST 0x40000000 -#define CONTEXT_EXCEPTION_REPORTING 0x80000000 - -#endif // !defined(RC_INVOKED) - -// -// Context Frame -// -// This frame has a several purposes: 1) it is used as an argument to -// NtContinue, 2) it is used to construct a call frame for APC delivery, -// 3) it is used to construct a call frame for exception dispatching -// in user mode, 4) it is used in the user level thread creation -// routines, and 5) it is used to to pass thread state to debuggers. -// -// N.B. Because this record is used as a call frame, it must be EXACTLY -// a multiple of 16 bytes in length and aligned on a 16-byte boundary. -// - -typedef struct _CONTEXT { - - // - // The flags values within this flag control the contents of - // a CONTEXT record. - // - // If the context record is used as an input parameter, then - // for each portion of the context record controlled by a flag - // whose value is set, it is assumed that that portion of the - // context record contains valid context. If the context record - // is being used to modify a thread's context, then only that - // portion of the threads context will be modified. - // - // If the context record is used as an IN OUT parameter to capture - // the context of a thread, then only those portions of the thread's - // context corresponding to set flags will be returned. - // - // The context record is never used as an OUT only parameter. - // - - DWORD ContextFlags; - DWORD Fill1[3]; // for alignment of following on 16-byte boundary - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_DEBUG. - // - // N.B. CONTEXT_DEBUG is *not* part of CONTEXT_FULL. - // - - ULONGLONG DbI0; - ULONGLONG DbI1; - ULONGLONG DbI2; - ULONGLONG DbI3; - ULONGLONG DbI4; - ULONGLONG DbI5; - ULONGLONG DbI6; - ULONGLONG DbI7; - - ULONGLONG DbD0; - ULONGLONG DbD1; - ULONGLONG DbD2; - ULONGLONG DbD3; - ULONGLONG DbD4; - ULONGLONG DbD5; - ULONGLONG DbD6; - ULONGLONG DbD7; - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_LOWER_FLOATING_POINT. - // - - FLOAT128 FltS0; - FLOAT128 FltS1; - FLOAT128 FltS2; - FLOAT128 FltS3; - FLOAT128 FltT0; - FLOAT128 FltT1; - FLOAT128 FltT2; - FLOAT128 FltT3; - FLOAT128 FltT4; - FLOAT128 FltT5; - FLOAT128 FltT6; - FLOAT128 FltT7; - FLOAT128 FltT8; - FLOAT128 FltT9; - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_HIGHER_FLOATING_POINT. - // - - FLOAT128 FltS4; - FLOAT128 FltS5; - FLOAT128 FltS6; - FLOAT128 FltS7; - FLOAT128 FltS8; - FLOAT128 FltS9; - FLOAT128 FltS10; - FLOAT128 FltS11; - FLOAT128 FltS12; - FLOAT128 FltS13; - FLOAT128 FltS14; - FLOAT128 FltS15; - FLOAT128 FltS16; - FLOAT128 FltS17; - FLOAT128 FltS18; - FLOAT128 FltS19; - - FLOAT128 FltF32; - FLOAT128 FltF33; - FLOAT128 FltF34; - FLOAT128 FltF35; - FLOAT128 FltF36; - FLOAT128 FltF37; - FLOAT128 FltF38; - FLOAT128 FltF39; - - FLOAT128 FltF40; - FLOAT128 FltF41; - FLOAT128 FltF42; - FLOAT128 FltF43; - FLOAT128 FltF44; - FLOAT128 FltF45; - FLOAT128 FltF46; - FLOAT128 FltF47; - FLOAT128 FltF48; - FLOAT128 FltF49; - - FLOAT128 FltF50; - FLOAT128 FltF51; - FLOAT128 FltF52; - FLOAT128 FltF53; - FLOAT128 FltF54; - FLOAT128 FltF55; - FLOAT128 FltF56; - FLOAT128 FltF57; - FLOAT128 FltF58; - FLOAT128 FltF59; - - FLOAT128 FltF60; - FLOAT128 FltF61; - FLOAT128 FltF62; - FLOAT128 FltF63; - FLOAT128 FltF64; - FLOAT128 FltF65; - FLOAT128 FltF66; - FLOAT128 FltF67; - FLOAT128 FltF68; - FLOAT128 FltF69; - - FLOAT128 FltF70; - FLOAT128 FltF71; - FLOAT128 FltF72; - FLOAT128 FltF73; - FLOAT128 FltF74; - FLOAT128 FltF75; - FLOAT128 FltF76; - FLOAT128 FltF77; - FLOAT128 FltF78; - FLOAT128 FltF79; - - FLOAT128 FltF80; - FLOAT128 FltF81; - FLOAT128 FltF82; - FLOAT128 FltF83; - FLOAT128 FltF84; - FLOAT128 FltF85; - FLOAT128 FltF86; - FLOAT128 FltF87; - FLOAT128 FltF88; - FLOAT128 FltF89; - - FLOAT128 FltF90; - FLOAT128 FltF91; - FLOAT128 FltF92; - FLOAT128 FltF93; - FLOAT128 FltF94; - FLOAT128 FltF95; - FLOAT128 FltF96; - FLOAT128 FltF97; - FLOAT128 FltF98; - FLOAT128 FltF99; - - FLOAT128 FltF100; - FLOAT128 FltF101; - FLOAT128 FltF102; - FLOAT128 FltF103; - FLOAT128 FltF104; - FLOAT128 FltF105; - FLOAT128 FltF106; - FLOAT128 FltF107; - FLOAT128 FltF108; - FLOAT128 FltF109; - - FLOAT128 FltF110; - FLOAT128 FltF111; - FLOAT128 FltF112; - FLOAT128 FltF113; - FLOAT128 FltF114; - FLOAT128 FltF115; - FLOAT128 FltF116; - FLOAT128 FltF117; - FLOAT128 FltF118; - FLOAT128 FltF119; - - FLOAT128 FltF120; - FLOAT128 FltF121; - FLOAT128 FltF122; - FLOAT128 FltF123; - FLOAT128 FltF124; - FLOAT128 FltF125; - FLOAT128 FltF126; - FLOAT128 FltF127; - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT | CONTEXT_CONTROL. - // - - ULONGLONG StFPSR; // FP status - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_INTEGER. - // - // N.B. The registers gp, sp, rp are part of the control context - // - - ULONGLONG IntGp; // r1, volatile - ULONGLONG IntT0; // r2-r3, volatile - ULONGLONG IntT1; // - ULONGLONG IntS0; // r4-r7, preserved - ULONGLONG IntS1; - ULONGLONG IntS2; - ULONGLONG IntS3; - ULONGLONG IntV0; // r8, volatile - ULONGLONG IntT2; // r9-r11, volatile - ULONGLONG IntT3; - ULONGLONG IntT4; - ULONGLONG IntSp; // stack pointer (r12), special - ULONGLONG IntTeb; // teb (r13), special - ULONGLONG IntT5; // r14-r31, volatile - ULONGLONG IntT6; - ULONGLONG IntT7; - ULONGLONG IntT8; - ULONGLONG IntT9; - ULONGLONG IntT10; - ULONGLONG IntT11; - ULONGLONG IntT12; - ULONGLONG IntT13; - ULONGLONG IntT14; - ULONGLONG IntT15; - ULONGLONG IntT16; - ULONGLONG IntT17; - ULONGLONG IntT18; - ULONGLONG IntT19; - ULONGLONG IntT20; - ULONGLONG IntT21; - ULONGLONG IntT22; - - ULONGLONG IntNats; // Nat bits for r1-r31 - // r1-r31 in bits 1 thru 31. - ULONGLONG Preds; // predicates, preserved - - ULONGLONG BrRp; // return pointer, b0, preserved - ULONGLONG BrS0; // b1-b5, preserved - ULONGLONG BrS1; - ULONGLONG BrS2; - ULONGLONG BrS3; - ULONGLONG BrS4; - ULONGLONG BrT0; // b6-b7, volatile - ULONGLONG BrT1; - - // - // This section is specified/returned if the ContextFlags word contains - // the flag CONTEXT_CONTROL. - // - - // Other application registers - ULONGLONG ApUNAT; // User Nat collection register, preserved - ULONGLONG ApLC; // Loop counter register, preserved - ULONGLONG ApEC; // Epilog counter register, preserved - ULONGLONG ApCCV; // CMPXCHG value register, volatile - ULONGLONG ApDCR; // Default control register (TBD) - - // Register stack info - ULONGLONG RsPFS; // Previous function state, preserved - ULONGLONG RsBSP; // Backing store pointer, preserved - ULONGLONG RsBSPSTORE; - ULONGLONG RsRSC; // RSE configuration, volatile - ULONGLONG RsRNAT; // RSE Nat collection register, preserved - - // Trap Status Information - ULONGLONG StIPSR; // Interruption Processor Status - ULONGLONG StIIP; // Interruption IP - ULONGLONG StIFS; // Interruption Function State - - // iA32 related control registers - ULONGLONG StFCR; // copy of Ar21 - ULONGLONG Eflag; // Eflag copy of Ar24 - ULONGLONG SegCSD; // iA32 CSDescriptor (Ar25) - ULONGLONG SegSSD; // iA32 SSDescriptor (Ar26) - ULONGLONG Cflag; // Cr0+Cr4 copy of Ar27 - ULONGLONG StFSR; // x86 FP status (copy of AR28) - ULONGLONG StFIR; // x86 FP status (copy of AR29) - ULONGLONG StFDR; // x86 FP status (copy of AR30) - - ULONGLONG UNUSEDPACK; // added to pack StFDR to 16-bytes - -} CONTEXT, *PCONTEXT, *LPCONTEXT; #elif defined(_AMD64_) // copied from winnt.h @@ -3286,13 +2539,9 @@ PALIMPORT BOOL PALAPI PAL_VirtualUnwindOutOfProc(CONTEXT *context, #define GetLogicalProcessorCacheSizeFromOS PAL_GetLogicalProcessorCacheSizeFromOS -#ifdef PLATFORM_UNIX - /* PAL_CS_NATIVE_DATA_SIZE is defined as sizeof(PAL_CRITICAL_SECTION_NATIVE_DATA) */ -#if defined(_AIX) -#define PAL_CS_NATIVE_DATA_SIZE 100 -#elif defined(__APPLE__) && defined(__i386__) +#if defined(__APPLE__) && defined(__i386__) #define PAL_CS_NATIVE_DATA_SIZE 76 #elif defined(__APPLE__) && defined(__x86_64__) #define PAL_CS_NATIVE_DATA_SIZE 120 @@ -3300,8 +2549,6 @@ PALIMPORT BOOL PALAPI PAL_VirtualUnwindOutOfProc(CONTEXT *context, #define PAL_CS_NATIVE_DATA_SIZE 12 #elif defined(__FreeBSD__) && defined(__x86_64__) #define PAL_CS_NATIVE_DATA_SIZE 24 -#elif defined(__hpux__) && (defined(__hppa__) || defined (__ia64__)) -#define PAL_CS_NATIVE_DATA_SIZE 148 #elif defined(__linux__) && defined(_ARM_) #define PAL_CS_NATIVE_DATA_SIZE 80 #elif defined(__linux__) && defined(_ARM64_) @@ -3314,25 +2561,13 @@ PALIMPORT BOOL PALAPI PAL_VirtualUnwindOutOfProc(CONTEXT *context, #define PAL_CS_NATIVE_DATA_SIZE 96 #elif defined(__NetBSD__) && defined(__earm__) #define PAL_CS_NATIVE_DATA_SIZE 56 -#elif defined(__NetBSD__) && defined(__hppa__) -#define PAL_CS_NATIVE_DATA_SIZE 92 #elif defined(__NetBSD__) && defined(__i386__) #define PAL_CS_NATIVE_DATA_SIZE 56 -#elif defined(__NetBSD__) && defined(__mips__) -#define PAL_CS_NATIVE_DATA_SIZE 56 -#elif defined(__NetBSD__) && (defined(__sparc__) && !defined(__sparc64__)) -#define PAL_CS_NATIVE_DATA_SIZE 56 -#elif defined(__NetBSD__) && defined(__sparc64__) -#define PAL_CS_NATIVE_DATA_SIZE 92 -#elif defined(__sun__) -#define PAL_CS_NATIVE_DATA_SIZE 48 #else #warning #error PAL_CS_NATIVE_DATA_SIZE is not defined for this architecture #endif -#endif // PLATFORM_UNIX - // typedef struct _CRITICAL_SECTION { PVOID DebugInfo; @@ -3342,7 +2577,6 @@ typedef struct _CRITICAL_SECTION { HANDLE LockSemaphore; ULONG_PTR SpinCount; -#ifdef PLATFORM_UNIX BOOL bInternal; volatile DWORD dwInitState; union CSNativeDataStorage @@ -3350,7 +2584,6 @@ typedef struct _CRITICAL_SECTION { BYTE rgNativeDataStorage[PAL_CS_NATIVE_DATA_SIZE]; VOID * pvAlign; // make sure the storage is machine-pointer-size aligned } csnds; -#endif // PLATFORM_UNIX } CRITICAL_SECTION, *PCRITICAL_SECTION, *LPCRITICAL_SECTION; PALIMPORT VOID PALAPI EnterCriticalSection(IN OUT LPCRITICAL_SECTION lpCriticalSection); @@ -4554,33 +3787,6 @@ PAL_GetCalendar( #define GEOID_NOT_AVAILABLE -1 -// "a number", might represent different types -typedef struct PALNUMBER__* PALNUMBER; - -// return NULL on OOM -PALIMPORT PALNUMBER PALAPI PAL_DoubleToNumber(double); -PALIMPORT PALNUMBER PALAPI PAL_Int64ToNumber(INT64); -PALIMPORT PALNUMBER PALAPI PAL_UInt64ToNumber(UINT64); -PALIMPORT PALNUMBER PALAPI PAL_IntToNumber(int); -PALIMPORT PALNUMBER PALAPI PAL_UIntToNumber(unsigned int); - -PALIMPORT void PALAPI PAL_ReleaseNumber(PALNUMBER); - - -// return string length if Buffer is NULL or the result fits in cchBuffer, otherwise -1 -PALIMPORT int PALAPI PAL_FormatScientific(LPCWSTR sLocale, LPWSTR pBuffer, SIZE_T cchBuffer, PALNUMBER number, int nMinDigits, int nMaxDigits, - LPCWSTR sExponent, LPCWSTR sNumberDecimal, LPCWSTR sPositive, LPCWSTR sNegative, LPCWSTR sZero); - -PALIMPORT int PALAPI PAL_FormatCurrency(LPCWSTR sLocale, LPWSTR pBuffer, SIZE_T cchBuffer, PALNUMBER number, int nMinDigits, int nMaxDigits, int iNegativeFormat, int iPositiveFormat, - int iPrimaryGroup, int iSecondaryGroup, LPCWSTR sCurrencyDecimal, LPCWSTR sCurrencyGroup, LPCWSTR sNegative, LPCWSTR sCurrency, LPCWSTR sZero); - -PALIMPORT int PALAPI PAL_FormatPercent(LPCWSTR sLocale, LPWSTR pBuffer, SIZE_T cchBuffer, PALNUMBER number, int nMinDigits, int nMaxDigits,int iNegativeFormat, int iPositiveFormat, - int iPrimaryGroup, int iSecondaryGroup, LPCWSTR sPercentDecimal, LPCWSTR sPercentGroup, LPCWSTR sNegative, LPCWSTR sPercent, LPCWSTR sZero); - -PALIMPORT int PALAPI PAL_FormatDecimal(LPCWSTR sLocale, LPWSTR pBuffer, SIZE_T cchBuffer, PALNUMBER number, int nMinDigits, int nMaxDigits, int iNegativeFormat, - int iPrimaryGroup, int iSecondaryGroup, LPCWSTR sDecimal, LPCWSTR sGroup, LPCWSTR sNegative, LPCWSTR sZero); - - #define DATE_USE_ALT_CALENDAR 0x00000004 #if ENABLE_DOWNLEVEL_FOR_NLS @@ -4706,7 +3912,7 @@ enum { // typedef struct _RUNTIME_FUNCTION { DWORD BeginAddress; -#ifdef _AMD64_ +#ifdef _TARGET_AMD64_ DWORD EndAddress; #endif DWORD UnwindData; @@ -5660,14 +4866,12 @@ CoCreateGuid(OUT GUID * pguid); /* Some C runtime functions needs to be reimplemented by the PAL. To avoid name collisions, those functions have been renamed using defines */ -#ifdef PLATFORM_UNIX #ifndef PAL_STDCPP_COMPAT #define exit PAL_exit #define atexit PAL_atexit #define printf PAL_printf #define vprintf PAL_vprintf #define wprintf PAL_wprintf -#define swprintf PAL_swprintf #define wcsspn PAL_wcsspn #define wcstod PAL_wcstod #define wcstol PAL_wcstol @@ -5694,8 +4898,6 @@ CoCreateGuid(OUT GUID * pguid); #define iswxdigit PAL_iswxdigit #define towlower PAL_towlower #define towupper PAL_towupper -#define vsprintf PAL_vsprintf -#define vswprintf PAL_vswprintf #define realloc PAL_realloc #define fopen PAL_fopen #define strtok PAL_strtok @@ -5758,8 +4960,8 @@ CoCreateGuid(OUT GUID * pguid); #define _close PAL__close #define _wcstoui64 PAL__wcstoui64 #define _flushall PAL__flushall -#define _vsnprintf PAL__vsnprintf #define strnlen PAL_strnlen +#define wcsnlen PAL_wcsnlen #ifdef _AMD64_ #define _mm_getcsr PAL__mm_getcsr @@ -5767,7 +4969,6 @@ CoCreateGuid(OUT GUID * pguid); #endif // _AMD64_ #endif // !PAL_STDCPP_COMPAT -#endif // PLATFORM_UNIX #ifndef _CONST_RETURN #ifdef __cplusplus @@ -5836,7 +5037,6 @@ PALIMPORT char * __cdecl strstr(const char *, const char *); PALIMPORT char * __cdecl strtok(char *, const char *); PALIMPORT size_t __cdecl strspn(const char *, const char *); PALIMPORT size_t __cdecl strcspn(const char *, const char *); -PALIMPORT int __cdecl vsprintf(char *, const char *, va_list); PALIMPORT int __cdecl atoi(const char *); PALIMPORT LONG __cdecl atol(const char *); PALIMPORT ULONG __cdecl strtoul(const char *, char **, int); @@ -5900,7 +5100,6 @@ PALIMPORT WCHAR * __cdecl PAL_wcstok(WCHAR *, const WCHAR *); PALIMPORT size_t __cdecl PAL_wcscspn(const WCHAR *, const WCHAR *); PALIMPORT int __cdecl PAL_swprintf(WCHAR *, const WCHAR *, ...); PALIMPORT int __cdecl PAL_vswprintf(WCHAR *, const WCHAR *, va_list); -PALIMPORT int __cdecl PAL__vsnprintf(LPSTR Buffer, size_t Count, LPCSTR Format, va_list ap); PALIMPORT int __cdecl PAL_swscanf(const WCHAR *, const WCHAR *, ...); PALIMPORT LONG __cdecl PAL_wcstol(const WCHAR *, WCHAR **, int); PALIMPORT ULONG __cdecl PAL_wcstoul(const WCHAR *, WCHAR **, int); @@ -6048,17 +5247,11 @@ PALIMPORT char * __cdecl _strdup(const char *); #if defined(_MSC_VER) #define alloca _alloca -#elif defined(PLATFORM_UNIX) -#define _alloca alloca #else -// MingW -#define _alloca __builtin_alloca -#define alloca __builtin_alloca +#define _alloca alloca #endif //_MSC_VER -#if defined(__GNUC__) && defined(PLATFORM_UNIX) #define alloca __builtin_alloca -#endif // __GNUC__ #define max(a, b) (((a) > (b)) ? (a) : (b)) #define min(a, b) (((a) < (b)) ? (a) : (b)) @@ -6527,10 +5720,10 @@ public: } }; -typedef BOOL (PALAPI *PHARDWARE_EXCEPTION_HANDLER)(PAL_SEHException* ex); -typedef BOOL (PALAPI *PHARDWARE_EXCEPTION_SAFETY_CHECK_FUNCTION)(PCONTEXT contextRecord, PEXCEPTION_RECORD exceptionRecord); -typedef VOID (PALAPI *PTERMINATION_REQUEST_HANDLER)(); -typedef DWORD (PALAPI *PGET_GCMARKER_EXCEPTION_CODE)(LPVOID ip); +typedef BOOL (*PHARDWARE_EXCEPTION_HANDLER)(PAL_SEHException* ex); +typedef BOOL (*PHARDWARE_EXCEPTION_SAFETY_CHECK_FUNCTION)(PCONTEXT contextRecord, PEXCEPTION_RECORD exceptionRecord); +typedef VOID (*PTERMINATION_REQUEST_HANDLER)(); +typedef DWORD (*PGET_GCMARKER_EXCEPTION_CODE)(LPVOID ip); PALIMPORT VOID @@ -6819,24 +6012,13 @@ public: // Platform-specific library naming // -#ifdef PLATFORM_UNIX #ifdef __APPLE__ #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" -#define MAKEDLLNAME_A(name) "lib" name ".a" -#elif defined(__hppa__) || defined(_IA64_) -#define MAKEDLLNAME_W(name) L"lib" name L".sl" -#define MAKEDLLNAME_A(name) "lib" name ".sl" #else #define MAKEDLLNAME_W(name) u"lib" name u".so" #define MAKEDLLNAME_A(name) "lib" name ".so" #endif -#else -#define MAKEDLLNAME_W(name) name L".dll" -#define MAKEDLLNAME_A(name) name ".dll" -#endif #ifdef UNICODE #define MAKEDLLNAME(x) MAKEDLLNAME_W(x) @@ -6848,10 +6030,6 @@ public: #if __APPLE__ #define PAL_SHLIB_SUFFIX ".dylib" -#elif _AIX -#define PAL_SHLIB_SUFFIX ".a" -#elif _HPUX_ -#define PAL_SHLIB_SUFFIX ".sl" #else #define PAL_SHLIB_SUFFIX ".so" #endif diff --git a/src/pal/inc/pal_char16.h b/src/pal/inc/pal_char16.h index 4600cc7..0697b23 100644 --- a/src/pal/inc/pal_char16.h +++ b/src/pal/inc/pal_char16.h @@ -27,12 +27,10 @@ This file is used to define the wchar_t type as a 16-bit type on Unix. // vc++, for whom wchar_t is already a typedef instead of a built-in. #ifndef PAL_STDCPP_COMPAT -#if defined (PLATFORM_UNIX) && defined(__GNUC__) #undef wchar_t #undef __WCHAR_TYPE__ #define __WCHAR_TYPE__ __wchar_16_cpp__ #define wchar_t __wchar_16_cpp__ -#endif // PLATFORM_UNIX // Set up the wchar_t type (which got preprocessed to __wchar_16_cpp__). // In C++11, the standard gives us char16_t, which is what we want (and matches types with u"") @@ -40,7 +38,6 @@ This file is used to define the wchar_t type as a 16-bit type on Unix. // **** WARNING: Linking C and C++ objects will break with -fstrict-aliasing with GCC/Clang // due to conditional typedef #if !defined(_WCHAR_T_DEFINED) || !defined(_MSC_VER) -#if defined (PLATFORM_UNIX) #if defined(__cplusplus) #undef __WCHAR_TYPE__ #define __WCHAR_TYPE__ char16_t @@ -50,7 +47,7 @@ typedef char16_t wchar_t; #define __WCHAR_TYPE__ unsigned short typedef unsigned short wchar_t; #endif // __cplusplus -#endif // PLATFORM_UNIX + #ifndef _WCHAR_T_DEFINED #define _WCHAR_T_DEFINED #endif // !_WCHAR_T_DEFINED diff --git a/src/pal/inc/pal_mstypes.h b/src/pal/inc/pal_mstypes.h index b9c3ac2..1f5c11d 100644 --- a/src/pal/inc/pal_mstypes.h +++ b/src/pal/inc/pal_mstypes.h @@ -235,13 +235,8 @@ typedef long double LONG_DOUBLE; typedef void VOID; -#ifndef PLATFORM_UNIX -typedef long LONG; -typedef unsigned long ULONG; -#else typedef int LONG; // NOTE: diff from windows.h, for LP64 compat typedef unsigned int ULONG; // NOTE: diff from windows.h, for LP64 compat -#endif typedef __int64 LONGLONG; typedef unsigned __int64 ULONGLONG; @@ -260,12 +255,7 @@ typedef UCHAR *PUCHAR; typedef char *PSZ; typedef ULONGLONG DWORDLONG; -#ifndef PLATFORM_UNIX -typedef unsigned long DWORD; -#else typedef unsigned int DWORD; // NOTE: diff from windows.h, for LP64 compat -#endif - typedef unsigned int DWORD32, *PDWORD32; typedef int BOOL; diff --git a/src/pal/inc/rt/intsafe.h b/src/pal/inc/rt/intsafe.h index 2ab2cf1..4ed70e7 100644 --- a/src/pal/inc/rt/intsafe.h +++ b/src/pal/inc/rt/intsafe.h @@ -38,47 +38,6 @@ UnsignedMultiply128 ( #endif #endif // _AMD64_ -#ifndef FEATURE_PAL - -#ifdef _WIN64 -typedef unsigned __int64 size_t; -typedef unsigned __int64 UINT_PTR; -typedef unsigned __int64 ULONG_PTR; -typedef unsigned __int64 DWORD_PTR; -typedef unsigned __int64 SIZE_T; -#else -typedef __w64 unsigned int size_t; -typedef __w64 unsigned int UINT_PTR; -typedef __w64 unsigned long ULONG_PTR; -typedef __w64 unsigned long DWORD_PTR; -typedef __w64 unsigned long SIZE_T; -#endif -typedef char CHAR; -typedef int INT; -typedef long LONG; -typedef unsigned char UCHAR; -typedef unsigned short USHORT; -typedef unsigned short WORD; -typedef unsigned int UINT; -typedef unsigned long ULONG; -typedef unsigned long DWORD; -typedef unsigned __int64 ULONGLONG; - - -typedef LONG HRESULT; - -#ifndef SUCCEEDED -#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0) -#endif - -#ifndef FAILED -#define FAILED(hr) (((HRESULT)(hr)) < 0) -#endif - -#define S_OK ((HRESULT)0x00000000L) - -#endif // !FEATURE_PAL - #define INTSAFE_E_ARITHMETIC_OVERFLOW ((HRESULT)0x80070216L) // 0x216 = 534 = ERROR_ARITHMETIC_OVERFLOW #ifndef LOWORD @@ -93,8 +52,7 @@ typedef LONG HRESULT; #define LODWORD(_qw) ((ULONG)(_qw)) #if defined(MIDL_PASS) || defined(RC_INVOKED) || defined(_M_CEE_PURE) \ - || defined(_68K_) || defined(_MPPC_) || defined(_PPC_) \ - || defined(_M_IA64) || defined(_M_AMD64) || defined(__ARM_ARCH) + || defined(_M_AMD64) || defined(__ARM_ARCH) #ifndef UInt32x32To64 #define UInt32x32To64(a, b) ((unsigned __int64)((ULONG)(a)) * (unsigned __int64)((ULONG)(b))) diff --git a/src/pal/inc/rt/palrt.h b/src/pal/inc/rt/palrt.h index c181f38..059d3a6 100644 --- a/src/pal/inc/rt/palrt.h +++ b/src/pal/inc/rt/palrt.h @@ -223,19 +223,11 @@ inline void *__cdecl operator new(size_t, void *_P) // PAL_safe_offsetof is a version of offsetof that protects against an // overridden operator& -#if defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 5 || __GNUC__ > 3) #define FIELD_OFFSET(type, field) __builtin_offsetof(type, field) #ifndef offsetof #define offsetof(type, field) __builtin_offsetof(type, field) #endif #define PAL_safe_offsetof(type, field) __builtin_offsetof(type, field) -#else -#define FIELD_OFFSET(type, field) (((LONG)(LONG_PTR)&(((type *)64)->field)) - 64) -#ifndef offsetof -#define offsetof(s,m) ((size_t)((ptrdiff_t)&(((s *)64)->m)) - 64) -#endif -#define PAL_safe_offsetof(s,m) ((size_t)((ptrdiff_t)&(char&)(((s *)64)->m))-64) -#endif #define CONTAINING_RECORD(address, type, field) \ ((type *)((LONG_PTR)(address) - FIELD_OFFSET(type, field))) @@ -243,7 +235,7 @@ inline void *__cdecl operator new(size_t, void *_P) #define ARGUMENT_PRESENT(ArgumentPointer) (\ (CHAR *)(ArgumentPointer) != (CHAR *)(NULL) ) -#if defined(_WIN64) || defined(_M_ALPHA) +#if defined(_WIN64) #define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG) #else #define MAX_NATURAL_ALIGNMENT sizeof(ULONG) @@ -893,7 +885,6 @@ Remember to fix the errcode defintion in safecrt.h. */ #define _wcslwr_s _wcslwr_unsafe -#define _snprintf_s _snprintf_unsafe #define swscanf_s swscanf #define _wfopen_s _wfopen_unsafe @@ -903,8 +894,6 @@ Remember to fix the errcode defintion in safecrt.h. #define _vscprintf _vscprintf_unsafe -#define vsprintf_s _vsnprintf - extern "C++" { #include <safemath.h> @@ -959,8 +948,11 @@ inline int __cdecl _vscprintf_unsafe(const char *_Format, va_list _ArgList) if(buf == nullptr) return 0; - int ret = _vsnprintf(buf, guess, _Format, _ArgList); + va_list argListCopy; + va_copy(argListCopy, _ArgList); + int ret = _vsnprintf_s(buf, guess, _TRUNCATE, _Format, argListCopy); free(buf); + va_end(argListCopy); if ((ret != -1) && (ret < guess)) return ret; @@ -969,28 +961,6 @@ inline int __cdecl _vscprintf_unsafe(const char *_Format, va_list _ArgList) } } -inline int __cdecl _vsnprintf_unsafe(char *_Dst, size_t _SizeInWords, size_t _Count, const char *_Format, va_list _ArgList) -{ - if (_Count == _TRUNCATE) _Count = _SizeInWords - 1; - int ret = _vsnprintf(_Dst, _Count, _Format, _ArgList); - _Dst[_SizeInWords - 1] = L'\0'; - if (ret < 0 && errno == 0) - { - errno = ERANGE; - } - return ret; -} - -inline int __cdecl _snprintf_unsafe(char *_Dst, size_t _SizeInWords, size_t _Count, const char *_Format, ...) -{ - int ret; - va_list _ArgList; - va_start(_ArgList, _Format); - ret = _vsnprintf_unsafe(_Dst, _SizeInWords, _Count, _Format, _ArgList); - va_end(_ArgList); - return ret; -} - inline errno_t __cdecl _wfopen_unsafe(PAL_FILE * *ff, const WCHAR *fileName, const WCHAR *mode) { PAL_FILE *result = _wfopen(fileName, mode); @@ -1208,7 +1178,6 @@ typedef VOID (__stdcall *WAITORTIMERCALLBACK)(PVOID, BOOLEAN); #define _ReturnAddress() __builtin_return_address(0) -#ifdef PLATFORM_UNIX #define DIRECTORY_SEPARATOR_CHAR_A '/' #define DIRECTORY_SEPARATOR_CHAR_W W('/') #define DIRECTORY_SEPARATOR_STR_A "/" @@ -1216,15 +1185,6 @@ typedef VOID (__stdcall *WAITORTIMERCALLBACK)(PVOID, BOOLEAN); #define PATH_SEPARATOR_CHAR_W W(':') #define PATH_SEPARATOR_STR_W W(":") #define VOLUME_SEPARATOR_CHAR_W W('/') -#else // PLATFORM_UNIX -#define DIRECTORY_SEPARATOR_CHAR_A '\\' -#define DIRECTORY_SEPARATOR_CHAR_W W('\\') -#define DIRECTORY_SEPARATOR_STR_A "\\" -#define DIRECTORY_SEPARATOR_STR_W W("\\") -#define PATH_SEPARATOR_CHAR_W W(';') -#define PATH_SEPARATOR_STR_W W(";") -#define VOLUME_SEPARATOR_CHAR_W W(':') -#endif // PLATFORM_UNIX #ifndef IMAGE_IMPORT_DESC_FIELD #define IMAGE_IMPORT_DESC_FIELD(img, f) ((img).u.f) @@ -1546,6 +1506,7 @@ typedef struct _DISPATCHER_CONTEXT { PEXCEPTION_ROUTINE LanguageHandler; PVOID HandlerData; PUNWIND_HISTORY_TABLE HistoryTable; + BOOLEAN ControlPcIsUnwound; } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT; #else diff --git a/src/pal/inc/rt/safecrt.h b/src/pal/inc/rt/safecrt.h index 3cc10ce..92366df 100644 --- a/src/pal/inc/rt/safecrt.h +++ b/src/pal/inc/rt/safecrt.h @@ -135,11 +135,7 @@ typedef _W64 unsigned int uintptr_t; #define _UINTPTR_T_DEFINED #endif -#if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ >= 3)) #define SAFECRT_DEPRECATED __declspec(deprecated) -#else -#define SAFECRT_DEPRECATED -#endif /* errno_t */ #if !defined(_ERRCODE_DEFINED) @@ -3253,10 +3249,6 @@ int __cdecl vswprintf_s(WCHAR (&_Dst)[_SizeInWords], const WCHAR *_Format, va_li * return -1 if the formatted string does not entirely fit into _Dst (we will not call _SAFECRT_INVALID_PARAMETER); * if _Count == 0, then (_Dst == nullptr && _SizeInBytes == 0) is allowed */ -_SAFECRT__EXTERN_C -int __cdecl _snprintf_s(char *_Dst, size_t _SizeInBytes, size_t _Count, const char *_Format, ...); -_SAFECRT__EXTERN_C -int __cdecl _vsnprintf_s(char *_Dst, size_t _SizeInBytes, size_t _Count, const char *_Format, va_list _ArgList); #if defined(__cplusplus) && _SAFECRT_USE_CPP_OVERLOADS template <size_t _SizeInBytes> diff --git a/src/pal/inc/rt/sal.h b/src/pal/inc/rt/sal.h index 0e3eaaa..0746864 100644 --- a/src/pal/inc/rt/sal.h +++ b/src/pal/inc/rt/sal.h @@ -2861,7 +2861,7 @@ of each annotation, see the advanced annotations section. #define __success(expr) _Success_(expr) #define __nullterminated _Null_terminated_ #define __nullnullterminated -#define __reserved _SAL1_Source_(__reserved, (), _Reserved_) +#define __clr_reserved _SAL1_Source_(__reserved, (), _Reserved_) #define __checkReturn _SAL1_Source_(__checkReturn, (), _Check_return_) #define __typefix(ctype) _SAL1_Source_(__typefix, (ctype), __inner_typefix(ctype)) #define __override __inner_override diff --git a/src/pal/inc/rt/specstrings_strict.h b/src/pal/inc/rt/specstrings_strict.h index 514106e..08d323c 100644 --- a/src/pal/inc/rt/specstrings_strict.h +++ b/src/pal/inc/rt/specstrings_strict.h @@ -626,7 +626,7 @@ #define __in_awcount(expr,size) __allowed(on_parameter) #define __nullterminated _SAL_VERSION_CHECK(__nullterminated) #define __nullnullterminated _SAL_VERSION_CHECK(__nullnullterminated) -#define __reserved _SAL_VERSION_CHECK(__reserved) +#define __clr_reserved _SAL_VERSION_CHECK(__reserved) #define __checkReturn _SAL_VERSION_CHECK(__checkReturn) #define __typefix(ctype) __allowed(on_parameter_or_return) #define __override __allowed(on_function) diff --git a/src/pal/inc/rt/specstrings_undef.h b/src/pal/inc/rt/specstrings_undef.h index b462dc2..69fc01c 100644 --- a/src/pal/inc/rt/specstrings_undef.h +++ b/src/pal/inc/rt/specstrings_undef.h @@ -445,7 +445,7 @@ #undef __readableTo #undef __readonly #undef __refparam -#undef __reserved +#undef __clr_reserved #undef __rpc_entry #undef __source_code_content #undef __struct_bcount diff --git a/src/pal/inc/rt/vsassert.h b/src/pal/inc/rt/vsassert.h index 1f16cf1..2a7fa5f 100644 --- a/src/pal/inc/rt/vsassert.h +++ b/src/pal/inc/rt/vsassert.h @@ -11,10 +11,6 @@ #ifndef __VSASSERT_H__ #define __VSASSERT_H__ -#ifndef FEATURE_PAL -#error "FEATURE_PAL must be defined for this file" -#else // FEATURE_PAL - #define VSASSERT(e, szMsg) \ do { \ if (!(e)) { \ @@ -94,5 +90,4 @@ do { \ #define VsIgnoreAllocs(f) -#endif // FEATURE_PAL #endif // __VSASSERT_H__ diff --git a/src/pal/inc/strsafe.h b/src/pal/inc/strsafe.h index 58749f2..f32f5e6 100644 --- a/src/pal/inc/strsafe.h +++ b/src/pal/inc/strsafe.h @@ -24,14 +24,6 @@ #pragma once #endif -#if defined(PLATFORM_UNIX) && !defined (FEATURE_PAL) -#define _NATIVE_WCHAR_T_DEFINED -#endif // defined(PLATFORM_UNIX) && !defined (FEATURE_PAL) - -#if defined(PLATFORM_UNIX) && !defined (FEATURE_PAL) -#define _vsnprintf vsnprintf -#endif // defined(PLATFORM_UNIX) && !defined (FEATURE_PAL) - #include <stdio.h> // for _vsnprintf, getc, getwc #include <string.h> // for memset #include <stdarg.h> // for va_start, etc. @@ -51,13 +43,6 @@ typedef char16_t WCHAR; #define _WCHAR_T_DEFINED #endif -#ifndef FEATURE_PAL -#ifndef _HRESULT_DEFINED -#define _HRESULT_DEFINED -typedef LONG HRESULT; -#endif // !_HRESULT_DEFINED -#endif // !FEATURE_PAL - #ifndef SUCCEEDED #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0) #endif @@ -150,14 +135,6 @@ STRSAFEAPI StringLengthWorkerA(const char* psz, size_t cchMax, size_t* pcch); STRSAFEAPI StringLengthWorkerW(const WCHAR* psz, size_t cchMax, size_t* pcch); #endif // STRSAFE_INLINE -#ifndef STRSAFE_LIB_IMPL -#ifndef FEATURE_PAL -// these functions are always inline -STRSAFE_INLINE_API StringGetsExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags); -STRSAFE_INLINE_API StringGetsExWorkerW(WCHAR* pszDest, size_t cchDest, size_t cbDest, WCHAR** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags); -#endif // !FEATURE_PAL -#endif - #ifndef STRSAFE_NO_CCH_FUNCTIONS /*++ @@ -247,7 +224,6 @@ STRSAFEAPI StringCchCopyA(char* pszDest, size_t cchDest, const char* pszSrc) return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCchCopyW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc) { HRESULT hr; @@ -263,7 +239,6 @@ STRSAFEAPI StringCchCopyW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc) return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CCH_FUNCTIONS @@ -361,7 +336,6 @@ STRSAFEAPI StringCbCopyA(char* pszDest, size_t cbDest, const char* pszSrc) return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCbCopyW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc) { HRESULT hr; @@ -381,7 +355,6 @@ STRSAFEAPI StringCbCopyW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc) return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CB_FUNCTIONS @@ -506,7 +479,6 @@ STRSAFEAPI StringCchCopyExA(char* pszDest, size_t cchDest, const char* pszSrc, c return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCchCopyExW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, WCHAR** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) { HRESULT hr; @@ -527,7 +499,6 @@ STRSAFEAPI StringCchCopyExW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CCH_FUNCTIONS @@ -660,7 +631,6 @@ STRSAFEAPI StringCbCopyExA(char* pszDest, size_t cbDest, const char* pszSrc, cha return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCbCopyExW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc, WCHAR** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags) { HRESULT hr; @@ -689,7 +659,6 @@ STRSAFEAPI StringCbCopyExW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc, W return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CB_FUNCTIONS @@ -784,7 +753,6 @@ STRSAFEAPI StringCchCopyNA(char* pszDest, size_t cchDest, const char* pszSrc, si return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCchCopyNW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, size_t cchSrc) { HRESULT hr; @@ -801,7 +769,6 @@ STRSAFEAPI StringCchCopyNW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CCH_FUNCTIONS @@ -902,7 +869,6 @@ STRSAFEAPI StringCbCopyNA(char* pszDest, size_t cbDest, const char* pszSrc, size return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCbCopyNW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc, size_t cbSrc) { HRESULT hr; @@ -925,7 +891,6 @@ STRSAFEAPI StringCbCopyNW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc, si return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CB_FUNCTIONS @@ -1060,7 +1025,6 @@ STRSAFEAPI StringCchCopyNExA(char* pszDest, size_t cchDest, const char* pszSrc, return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCchCopyNExW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, size_t cchSrc, WCHAR** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) { HRESULT hr; @@ -1082,7 +1046,6 @@ STRSAFEAPI StringCchCopyNExW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CCH_FUNCTIONS @@ -1226,7 +1189,6 @@ STRSAFEAPI StringCbCopyNExA(char* pszDest, size_t cbDest, const char* pszSrc, si return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCbCopyNExW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc, size_t cbSrc, WCHAR** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags) { HRESULT hr; @@ -1258,7 +1220,6 @@ STRSAFEAPI StringCbCopyNExW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc, return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CB_FUNCTIONS @@ -1345,7 +1306,6 @@ STRSAFEAPI StringCchCatA(char* pszDest, size_t cchDest, const char* pszSrc) return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCchCatW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc) { HRESULT hr; @@ -1361,7 +1321,6 @@ STRSAFEAPI StringCchCatW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc) return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CCH_FUNCTIONS @@ -1451,7 +1410,6 @@ STRSAFEAPI StringCbCatA(char* pszDest, size_t cbDest, const char* pszSrc) return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCbCatW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc) { HRESULT hr; @@ -1470,7 +1428,6 @@ STRSAFEAPI StringCbCatW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc) return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CB_FUNCTIONS @@ -1598,7 +1555,6 @@ STRSAFEAPI StringCchCatExA(char* pszDest, size_t cchDest, const char* pszSrc, ch return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCchCatExW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, WCHAR** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) { HRESULT hr; @@ -1619,7 +1575,6 @@ STRSAFEAPI StringCchCatExW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CCH_FUNCTIONS @@ -1755,7 +1710,6 @@ STRSAFEAPI StringCbCatExA(char* pszDest, size_t cbDest, const char* pszSrc, char return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCbCatExW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc, WCHAR** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags) { HRESULT hr; @@ -1784,7 +1738,6 @@ STRSAFEAPI StringCbCatExW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc, WC return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CB_FUNCTIONS @@ -1877,7 +1830,6 @@ STRSAFEAPI StringCchCatNA(char* pszDest, size_t cchDest, const char* pszSrc, siz return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCchCatNW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, size_t cchMaxAppend) { HRESULT hr; @@ -1893,7 +1845,6 @@ STRSAFEAPI StringCchCatNW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, s return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CCH_FUNCTIONS @@ -1993,7 +1944,6 @@ STRSAFEAPI StringCbCatNA(char* pszDest, size_t cbDest, const char* pszSrc, size_ return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCbCatNW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc, size_t cbMaxAppend) { HRESULT hr; @@ -2016,7 +1966,6 @@ STRSAFEAPI StringCbCatNW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc, siz return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CB_FUNCTIONS @@ -2147,7 +2096,6 @@ STRSAFEAPI StringCchCatNExA(char* pszDest, size_t cchDest, const char* pszSrc, s return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCchCatNExW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, size_t cchMaxAppend, WCHAR** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) { HRESULT hr; @@ -2168,7 +2116,6 @@ STRSAFEAPI StringCchCatNExW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CCH_FUNCTIONS @@ -2311,7 +2258,6 @@ STRSAFEAPI StringCbCatNExA(char* pszDest, size_t cbDest, const char* pszSrc, siz return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCbCatNExW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc, size_t cbMaxAppend, WCHAR** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags) { HRESULT hr; @@ -2344,7 +2290,6 @@ STRSAFEAPI StringCbCatNExW(WCHAR* pszDest, size_t cbDest, const WCHAR* pszSrc, s return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CB_FUNCTIONS @@ -2403,62 +2348,7 @@ Return Value: --*/ -#ifndef FEATURE_PAL -#ifndef STRSAFE_LIB_IMPL -STRSAFE_INLINE_API StringCchGetsA(char* pszDest, size_t cchDest); -STRSAFE_INLINE_API StringCchGetsW(WCHAR* pszDest, size_t cchDest); -#ifdef UNICODE -#define StringCchGets StringCchGetsW -#else -#define StringCchGets StringCchGetsA -#endif // !UNICODE - -STRSAFE_INLINE_API StringCchGetsA(char* pszDest, size_t cchDest) -{ - HRESULT hr; - - if (cchDest > STRSAFE_MAX_CCH) - { - hr = STRSAFE_E_INVALID_PARAMETER; - } - else - { - size_t cbDest; - - // safe to multiply cchDest * sizeof(char) since cchDest < STRSAFE_MAX_CCH and sizeof(char) is 1 - cbDest = cchDest * sizeof(char); - - hr = StringGetsExWorkerA(pszDest, cchDest, cbDest, NULL, NULL, 0); - } - - return hr; -} - -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) -STRSAFE_INLINE_API StringCchGetsW(WCHAR* pszDest, size_t cchDest) -{ - HRESULT hr; - - if (cchDest > STRSAFE_MAX_CCH) - { - hr = STRSAFE_E_INVALID_PARAMETER; - } - else - { - size_t cbDest; - - // safe to multiply cchDest * sizeof(WCHAR) since cchDest < STRSAFE_MAX_CCH and sizeof(WCHAR) is 2 - cbDest = cchDest * sizeof(WCHAR); - - hr = StringGetsExWorkerW(pszDest, cchDest, cbDest, NULL, NULL, 0); - } - - return hr; -} -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // !STRSAFE_NO_CCH_FUNCTIONS -#endif // !STRSAFE_LIB_IMPL -#endif // !FEATURE_PAL #ifndef STRSAFE_NO_CB_FUNCTIONS /*++ @@ -2514,60 +2404,7 @@ Return Value: --*/ -#ifndef FEATURE_PAL -#ifndef STRSAFE_LIB_IMPL -STRSAFE_INLINE_API StringCbGetsA(char* pszDest, size_t cbDest); -STRSAFE_INLINE_API StringCbGetsW(WCHAR* pszDest, size_t cbDest); -#ifdef UNICODE -#define StringCbGets StringCbGetsW -#else -#define StringCbGets StringCbGetsA -#endif // !UNICODE - -STRSAFE_INLINE_API StringCbGetsA(char* pszDest, size_t cbDest) -{ - HRESULT hr; - size_t cchDest; - - // convert to count of characters - cchDest = cbDest / sizeof(char); - - if (cchDest > STRSAFE_MAX_CCH) - { - hr = STRSAFE_E_INVALID_PARAMETER; - } - else - { - hr = StringGetsExWorkerA(pszDest, cchDest, cbDest, NULL, NULL, 0); - } - - return hr; -} - -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) -STRSAFE_INLINE_API StringCbGetsW(WCHAR* pszDest, size_t cbDest) -{ - HRESULT hr; - size_t cchDest; - - // convert to count of characters - cchDest = cbDest / sizeof(WCHAR); - - if (cchDest > STRSAFE_MAX_CCH) - { - hr = STRSAFE_E_INVALID_PARAMETER; - } - else - { - hr = StringGetsExWorkerW(pszDest, cchDest, cbDest, NULL, NULL, 0); - } - - return hr; -} -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // !STRSAFE_NO_CB_FUNCTIONS -#endif // !STRSAFE_LIB_IMPL -#endif // !FEATURE_PAL #ifndef STRSAFE_NO_CCH_FUNCTIONS /*++ @@ -2650,62 +2487,7 @@ Return Value: --*/ -#ifndef FEATURE_PAL -#ifndef STRSAFE_LIB_IMPL -STRSAFE_INLINE_API StringCchGetsExA(char* pszDest, size_t cchDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags); -STRSAFE_INLINE_API StringCchGetsExW(WCHAR* pszDest, size_t cchDest, WCHAR** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags); -#ifdef UNICODE -#define StringCchGetsEx StringCchGetsExW -#else -#define StringCchGetsEx StringCchGetsExA -#endif // !UNICODE - -STRSAFE_INLINE_API StringCchGetsExA(char* pszDest, size_t cchDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) -{ - HRESULT hr; - - if (cchDest > STRSAFE_MAX_CCH) - { - hr = STRSAFE_E_INVALID_PARAMETER; - } - else - { - size_t cbDest; - - // safe to multiply cchDest * sizeof(char) since cchDest < STRSAFE_MAX_CCH and sizeof(char) is 1 - cbDest = cchDest * sizeof(char); - - hr = StringGetsExWorkerA(pszDest, cchDest, cbDest, ppszDestEnd, pcchRemaining, dwFlags); - } - - return hr; -} - -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) -STRSAFE_INLINE_API StringCchGetsExW(WCHAR* pszDest, size_t cchDest, WCHAR** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) -{ - HRESULT hr; - - if (cchDest > STRSAFE_MAX_CCH) - { - hr = STRSAFE_E_INVALID_PARAMETER; - } - else - { - size_t cbDest; - - // safe to multiply cchDest * sizeof(WCHAR) since cchDest < STRSAFE_MAX_CCH and sizeof(WCHAR) is 2 - cbDest = cchDest * sizeof(WCHAR); - - hr = StringGetsExWorkerW(pszDest, cchDest, cbDest, ppszDestEnd, pcchRemaining, dwFlags); - } - - return hr; -} -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // !STRSAFE_NO_CCH_FUNCTIONS -#endif // !STRSAFE_LIB_IMPL -#endif // !FEATURE_PAL #ifndef STRSAFE_NO_CB_FUNCTIONS /*++ @@ -2788,82 +2570,7 @@ Return Value: --*/ -#ifndef FEATURE_PAL -#ifndef STRSAFE_LIB_IMPL -STRSAFE_INLINE_API StringCbGetsExA(char* pszDest, size_t cbDest, char** ppszDestEnd, size_t* pbRemaining, unsigned long dwFlags); -STRSAFE_INLINE_API StringCbGetsExW(WCHAR* pszDest, size_t cbDest, WCHAR** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags); -#ifdef UNICODE -#define StringCbGetsEx StringCbGetsExW -#else -#define StringCbGetsEx StringCbGetsExA -#endif // !UNICODE - -STRSAFE_INLINE_API StringCbGetsExA(char* pszDest, size_t cbDest, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags) -{ - HRESULT hr; - size_t cchDest; - size_t cchRemaining = 0; - - cchDest = cbDest / sizeof(char); - - if (cchDest > STRSAFE_MAX_CCH) - { - hr = STRSAFE_E_INVALID_PARAMETER; - } - else - { - hr = StringGetsExWorkerA(pszDest, cchDest, cbDest, ppszDestEnd, &cchRemaining, dwFlags); - } - - if (SUCCEEDED(hr) || - (hr == STRSAFE_E_INSUFFICIENT_BUFFER) || - (hr == STRSAFE_E_END_OF_FILE)) - { - if (pcbRemaining) - { - // safe to multiply cchRemaining * sizeof(char) since cchRemaining < STRSAFE_MAX_CCH and sizeof(char) is 1 - *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char)); - } - } - - return hr; -} - -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) -STRSAFE_INLINE_API StringCbGetsExW(WCHAR* pszDest, size_t cbDest, WCHAR** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags) -{ - HRESULT hr; - size_t cchDest; - size_t cchRemaining = 0; - - cchDest = cbDest / sizeof(WCHAR); - - if (cchDest > STRSAFE_MAX_CCH) - { - hr = STRSAFE_E_INVALID_PARAMETER; - } - else - { - hr = StringGetsExWorkerW(pszDest, cchDest, cbDest, ppszDestEnd, &cchRemaining, dwFlags); - } - - if (SUCCEEDED(hr) || - (hr == STRSAFE_E_INSUFFICIENT_BUFFER) || - (hr == STRSAFE_E_END_OF_FILE)) - { - if (pcbRemaining) - { - // safe to multiply cchRemaining * sizeof(WCHAR) since cchRemaining < STRSAFE_MAX_CCH and sizeof(WCHAR) is 2 - *pcbRemaining = (cchRemaining * sizeof(WCHAR)) + (cbDest % sizeof(WCHAR)); - } - } - - return hr; -} -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // !STRSAFE_NO_CB_FUNCTIONS -#endif // !STRSAFE_LIB_IMPL -#endif // !FEATURE_PAL #ifndef STRSAFE_NO_CCH_FUNCTIONS /*++ @@ -2937,7 +2644,6 @@ STRSAFEAPI StringCchLengthA(const char* psz, size_t cchMax, size_t* pcch) return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCchLengthW(const WCHAR* psz, size_t cchMax, size_t* pcch) { HRESULT hr; @@ -2953,7 +2659,6 @@ STRSAFEAPI StringCchLengthW(const WCHAR* psz, size_t cchMax, size_t* pcch) return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CCH_FUNCTIONS @@ -3040,7 +2745,6 @@ STRSAFEAPI StringCbLengthA(const char* psz, size_t cbMax, size_t* pcb) return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCbLengthW(const WCHAR* psz, size_t cbMax, size_t* pcb) { HRESULT hr; @@ -3066,7 +2770,6 @@ STRSAFEAPI StringCbLengthW(const WCHAR* psz, size_t cbMax, size_t* pcb) return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE #endif // !STRSAFE_NO_CB_FUNCTIONS @@ -3103,7 +2806,6 @@ STRSAFEAPI StringCopyWorkerA(char* pszDest, size_t cchDest, const char* pszSrc) return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCopyWorkerW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc) { HRESULT hr = S_OK; @@ -3133,7 +2835,6 @@ STRSAFEAPI StringCopyWorkerW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX STRSAFEAPI StringCopyExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, const char* pszSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) { @@ -3273,7 +2974,6 @@ STRSAFEAPI StringCopyExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, con return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCopyExWorkerW(WCHAR* pszDest, size_t cchDest, size_t cbDest, const WCHAR* pszSrc, WCHAR** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) { HRESULT hr = S_OK; @@ -3411,7 +3111,6 @@ STRSAFEAPI StringCopyExWorkerW(WCHAR* pszDest, size_t cchDest, size_t cbDest, co return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX STRSAFEAPI StringCopyNWorkerA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchSrc) { @@ -3444,7 +3143,6 @@ STRSAFEAPI StringCopyNWorkerA(char* pszDest, size_t cchDest, const char* pszSrc, return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCopyNWorkerW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, size_t cchSrc) { HRESULT hr = S_OK; @@ -3475,7 +3173,6 @@ STRSAFEAPI StringCopyNWorkerW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSr return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX STRSAFEAPI StringCopyNExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, const char* pszSrc, size_t cchSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) { @@ -3616,7 +3313,6 @@ STRSAFEAPI StringCopyNExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, co return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCopyNExWorkerW(WCHAR* pszDest, size_t cchDest, size_t cbDest, const WCHAR* pszSrc, size_t cchSrc, WCHAR** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) { HRESULT hr = S_OK; @@ -3755,7 +3451,6 @@ STRSAFEAPI StringCopyNExWorkerW(WCHAR* pszDest, size_t cchDest, size_t cbDest, c return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX STRSAFEAPI StringCatWorkerA(char* pszDest, size_t cchDest, const char* pszSrc) { @@ -3774,7 +3469,6 @@ STRSAFEAPI StringCatWorkerA(char* pszDest, size_t cchDest, const char* pszSrc) return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCatWorkerW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc) { HRESULT hr; @@ -3791,7 +3485,6 @@ STRSAFEAPI StringCatWorkerW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc) return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX STRSAFEAPI StringCatExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, const char* pszSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) { @@ -3940,7 +3633,6 @@ STRSAFEAPI StringCatExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, cons return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCatExWorkerW(WCHAR* pszDest, size_t cchDest, size_t cbDest, const WCHAR* pszSrc, WCHAR** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) { HRESULT hr = S_OK; @@ -4086,7 +3778,6 @@ STRSAFEAPI StringCatExWorkerW(WCHAR* pszDest, size_t cchDest, size_t cbDest, con return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX STRSAFEAPI StringCatNWorkerA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchMaxAppend) { @@ -4106,7 +3797,6 @@ STRSAFEAPI StringCatNWorkerA(char* pszDest, size_t cchDest, const char* pszSrc, return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCatNWorkerW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc, size_t cchMaxAppend) { HRESULT hr; @@ -4124,7 +3814,6 @@ STRSAFEAPI StringCatNWorkerW(WCHAR* pszDest, size_t cchDest, const WCHAR* pszSrc return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX STRSAFEAPI StringCatNExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, const char* pszSrc, size_t cchMaxAppend, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) { @@ -4272,7 +3961,6 @@ STRSAFEAPI StringCatNExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, con return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringCatNExWorkerW(WCHAR* pszDest, size_t cchDest, size_t cbDest, const WCHAR* pszSrc, size_t cchMaxAppend, WCHAR** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) { HRESULT hr = S_OK; @@ -4419,7 +4107,6 @@ STRSAFEAPI StringCatNExWorkerW(WCHAR* pszDest, size_t cchDest, size_t cbDest, co return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX STRSAFEAPI StringLengthWorkerA(const char* psz, size_t cchMax, size_t* pcch) { @@ -4446,7 +4133,6 @@ STRSAFEAPI StringLengthWorkerA(const char* psz, size_t cchMax, size_t* pcch) return hr; } -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) STRSAFEAPI StringLengthWorkerW(const WCHAR* psz, size_t cchMax, size_t* pcch) { HRESULT hr = S_OK; @@ -4471,285 +4157,6 @@ STRSAFEAPI StringLengthWorkerW(const WCHAR* psz, size_t cchMax, size_t* pcch) return hr; } -#endif // FEATURE_PAL || !PLATFORM_UNIX #endif // STRSAFE_INLINE -#ifndef STRSAFE_LIB_IMPL -#ifndef FEATURE_PAL -STRSAFE_INLINE_API StringGetsExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) -{ - HRESULT hr = S_OK; - char* pszDestEnd = pszDest; - size_t cchRemaining = 0; - - // ASSERT(cbDest == (cchDest * sizeof(char)) || - // cbDest == (cchDest * sizeof(char)) + (cbDest % sizeof(char))); - - // only accept valid flags - if (dwFlags & (~STRSAFE_VALID_FLAGS)) - { - hr = STRSAFE_E_INVALID_PARAMETER; - } - else - { - if (dwFlags & STRSAFE_IGNORE_NULLS) - { - if (pszDest == NULL) - { - if ((cchDest != 0) || (cbDest != 0)) - { - // NULL pszDest and non-zero cchDest/cbDest is invalid - hr = STRSAFE_E_INVALID_PARAMETER; - } - } - } - - if (SUCCEEDED(hr)) - { - if (cchDest <= 1) - { - pszDestEnd = pszDest; - cchRemaining = cchDest; - - if (cchDest == 1) - { - *pszDestEnd = '\0'; - } - - hr = STRSAFE_E_INSUFFICIENT_BUFFER; - } - else - { - char ch; - - pszDestEnd = pszDest; - cchRemaining = cchDest; - - while ((cchRemaining > 1) && (ch = (char)getc(stdin)) != '\n') - { - if (ch == EOF) - { - if (pszDestEnd == pszDest) - { - // we failed to read anything from stdin - hr = STRSAFE_E_END_OF_FILE; - } - break; - } - - *pszDestEnd = ch; - - pszDestEnd++; - cchRemaining--; - } - - if (cchRemaining > 0) - { - // there is extra room - if (dwFlags & STRSAFE_FILL_BEHIND_NULL) - { - memset(pszDestEnd + 1, STRSAFE_GET_FILL_PATTERN(dwFlags), ((cchRemaining - 1) * sizeof(char)) + (cbDest % sizeof(char))); - } - } - - *pszDestEnd = '\0'; - } - } - } - - if (FAILED(hr)) - { - if (pszDest) - { - if (dwFlags & STRSAFE_FILL_ON_FAILURE) - { - memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest); - - if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0) - { - pszDestEnd = pszDest; - cchRemaining = cchDest; - } - else if (cchDest > 0) - { - pszDestEnd = pszDest + cchDest - 1; - cchRemaining = 1; - - // null terminate the end of the string - *pszDestEnd = '\0'; - } - } - - if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)) - { - if (cchDest > 0) - { - pszDestEnd = pszDest; - cchRemaining = cchDest; - - // null terminate the beginning of the string - *pszDestEnd = '\0'; - } - } - } - } - - if (SUCCEEDED(hr) || - (hr == STRSAFE_E_INSUFFICIENT_BUFFER) || - (hr == STRSAFE_E_END_OF_FILE)) - { - if (ppszDestEnd) - { - *ppszDestEnd = pszDestEnd; - } - - if (pcchRemaining) - { - *pcchRemaining = cchRemaining; - } - } - - return hr; -} - -#if defined(FEATURE_PAL) || !defined(PLATFORM_UNIX) -STRSAFE_INLINE_API StringGetsExWorkerW(WCHAR* pszDest, size_t cchDest, size_t cbDest, WCHAR** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags) -{ - HRESULT hr = S_OK; - WCHAR* pszDestEnd = pszDest; - size_t cchRemaining = 0; - - // ASSERT(cbDest == (cchDest * sizeof(char)) || - // cbDest == (cchDest * sizeof(char)) + (cbDest % sizeof(char))); - - // only accept valid flags - if (dwFlags & (~STRSAFE_VALID_FLAGS)) - { - hr = STRSAFE_E_INVALID_PARAMETER; - } - else - { - if (dwFlags & STRSAFE_IGNORE_NULLS) - { - if (pszDest == NULL) - { - if ((cchDest != 0) || (cbDest != 0)) - { - // NULL pszDest and non-zero cchDest/cbDest is invalid - hr = STRSAFE_E_INVALID_PARAMETER; - } - } - } - - if (SUCCEEDED(hr)) - { - if (cchDest <= 1) - { - pszDestEnd = pszDest; - cchRemaining = cchDest; - - if (cchDest == 1) - { - *pszDestEnd = L'\0'; - } - - hr = STRSAFE_E_INSUFFICIENT_BUFFER; - } - else - { - WCHAR ch; - - pszDestEnd = pszDest; - cchRemaining = cchDest; - - while ((cchRemaining > 1) && (ch = (WCHAR)getwc(stdin)) != L'\n') - { - if (ch == EOF) - { - if (pszDestEnd == pszDest) - { - // we failed to read anything from stdin - hr = STRSAFE_E_END_OF_FILE; - } - break; - } - - *pszDestEnd = ch; - - pszDestEnd++; - cchRemaining--; - } - - if (cchRemaining > 0) - { - // there is extra room - if (dwFlags & STRSAFE_FILL_BEHIND_NULL) - { - memset(pszDestEnd + 1, STRSAFE_GET_FILL_PATTERN(dwFlags), ((cchRemaining - 1) * sizeof(WCHAR)) + (cbDest % sizeof(WCHAR))); - } - } - - *pszDestEnd = L'\0'; - } - } - } - - if (FAILED(hr)) - { - if (pszDest) - { - if (dwFlags & STRSAFE_FILL_ON_FAILURE) - { - memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest); - - if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0) - { - pszDestEnd = pszDest; - cchRemaining = cchDest; - } - else if (cchDest > 0) - { - pszDestEnd = pszDest + cchDest - 1; - cchRemaining = 1; - - // null terminate the end of the string - *pszDestEnd = L'\0'; - } - } - - if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)) - { - if (cchDest > 0) - { - pszDestEnd = pszDest; - cchRemaining = cchDest; - - // null terminate the beginning of the string - *pszDestEnd = L'\0'; - } - } - } - } - - if (SUCCEEDED(hr) || - (hr == STRSAFE_E_INSUFFICIENT_BUFFER) || - (hr == STRSAFE_E_END_OF_FILE)) - { - if (ppszDestEnd) - { - *ppszDestEnd = pszDestEnd; - } - - if (pcchRemaining) - { - *pcchRemaining = cchRemaining; - } - } - - return hr; -} -#endif // FEATURE_PAL || !PLATFORM_UNIX -#endif // !FEATURE_PAL -#endif // !STRSAFE_LIB_IMPL - #endif // _STRSAFE_H_INCLUDED_ diff --git a/src/pal/inc/unixasmmacrosarm64.inc b/src/pal/inc/unixasmmacrosarm64.inc index 6014205..359f27f 100644 --- a/src/pal/inc/unixasmmacrosarm64.inc +++ b/src/pal/inc/unixasmmacrosarm64.inc @@ -37,7 +37,8 @@ C_FUNC(\Name\()_End): .endm .macro PREPARE_EXTERNAL_VAR Name, HelperReg - ldr \HelperReg, [pc, #C_FUNC(\Name)@GOTPCREL] + adrp \HelperReg, \Name + add \HelperReg, \HelperReg, :lo12:\Name .endm .macro PROLOG_STACK_ALLOC Size diff --git a/src/pal/src/CMakeLists.txt b/src/pal/src/CMakeLists.txt index 28ee83a..16c9d8b 100644 --- a/src/pal/src/CMakeLists.txt +++ b/src/pal/src/CMakeLists.txt @@ -23,20 +23,37 @@ include_directories(include) # Compile options -if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL AMD64) - set(PAL_CMAKE_PLATFORM_ARCH_AMD64 1) - add_definitions(-D_AMD64_) -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l) - set(PAL_CMAKE_PLATFORM_ARCH_ARM 1) - add_definitions(-D_ARM_) -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) - set(PAL_CMAKE_PLATFORM_ARCH_ARM64 1) - add_definitions(-D_ARM64_) -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686) - set(CLR_CMAKE_PLATFORM_ARCH_I386 1) - add_definitions(-D_X86_) +if(CLR_CROSS_COMPONENTS_BUILD) + if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL amd64) + if(CLR_CMAKE_TARGET_ARCH STREQUAL "arm") + set(PAL_CMAKE_PLATFORM_ARCH_I386 1) + add_definitions(-D_X86_) + else() + set(PAL_CMAKE_PLATFORM_ARCH_AMD64 1) + add_definitions(-D_AMD64_) + endif() + elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL i686) + set(PAL_CMAKE_PLATFORM_ARCH_I386 1) + add_definitions(-D_X86_) + else() + message(FATAL_ERROR "Only AMD64, I386 host for cross-architecture component is supported") + endif() else() - message(FATAL_ERROR "Only ARM and AMD64 is supported") + if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL AMD64) + set(PAL_CMAKE_PLATFORM_ARCH_AMD64 1) + add_definitions(-D_AMD64_) + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l) + set(PAL_CMAKE_PLATFORM_ARCH_ARM 1) + add_definitions(-D_ARM_) + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) + set(PAL_CMAKE_PLATFORM_ARCH_ARM64 1) + add_definitions(-D_ARM64_) + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686) + set(PAL_CMAKE_PLATFORM_ARCH_I386 1) + add_definitions(-D_X86_) + else() + message(FATAL_ERROR "Only ARM, AMD64, ARM64 and I386 is supported") + endif() endif() if(CMAKE_SYSTEM_NAME STREQUAL Darwin) @@ -65,7 +82,7 @@ elseif(PAL_CMAKE_PLATFORM_ARCH_ARM) elseif(PAL_CMAKE_PLATFORM_ARCH_ARM64) add_definitions(-DBIT64=1) add_definitions(-D_WIN64=1) -elseif(CLR_CMAKE_PLATFORM_ARCH_I386) +elseif(PAL_CMAKE_PLATFORM_ARCH_I386) add_definitions(-DBIT32=1) endif() @@ -105,7 +122,7 @@ elseif(PAL_CMAKE_PLATFORM_ARCH_ARM64) arch/arm64/exceptionhelper.S arch/arm64/processor.cpp ) -elseif(CLR_CMAKE_PLATFORM_ARCH_I386) +elseif(PAL_CMAKE_PLATFORM_ARCH_I386) set(ARCH_SOURCES arch/i386/context2.S arch/i386/debugbreak.S @@ -264,31 +281,73 @@ if(CMAKE_SYSTEM_NAME STREQUAL Linux) find_library(UNWIND_ARCH NAMES unwind-arm) endif() + if(PAL_CMAKE_PLATFORM_ARCH_ARM64) + find_library(UNWIND_ARCH NAMES unwind-aarch64) + endif() + if(PAL_CMAKE_PLATFORM_ARCH_AMD64) find_library(UNWIND_ARCH NAMES unwind-x86_64) endif() - if(CLR_CMAKE_PLATFORM_ALPINE_LINUX) + if(CLR_CMAKE_PLATFORM_ALPINE_LINUX OR CLR_CMAKE_PLATFORM_ANDROID) find_library(INTL intl) endif() - find_library(UNWIND NAMES unwind) + # On Android, we don't need to link with gcc_s, pthread and rt + if(NOT CLR_CMAKE_PLATFORM_ANDROID) + target_link_libraries(coreclrpal + gcc_s + pthread + rt + ) + endif() + + if(CLR_CMAKE_PLATFORM_ANDROID) + target_link_libraries(coreclrpal + gnustl_shared + android-support + android-glob) + endif() + + if(NOT CLR_CMAKE_PLATFORM_ANDROID) + find_library(UNWIND NAMES unwind) + + if(UNWIND STREQUAL UNWIND-NOTFOUND) + message(FATAL_ERROR "Cannot find libunwind. Try installing libunwind8-dev and libunwind8.") + endif(UNWIND STREQUAL UNWIND-NOTFOUND) + + target_link_libraries(coreclrpal ${UNWIND}) + endif() + + if(CLR_MAKE_PLATFORM_ANDROID) + find_library(ANDROID_SUPPORT NAMES android-support) + find_library(ANDROID_GLOB NAMES android-glob) + find_library(INTL NAMES intl) + + if(UNWIND_ARCH STREQUAL UNWIND_ARCH-NOTFOUND) + message(FATAL_ERROR "Cannot find libunwind.") + endif() + + if(ANDROID_SUPPORT STREQUAL ANDROID_SUPPORT-NOTFOUND) + message(FATAL_ERROR "Cannot find android-support.") + endif() + + if(ANDROID_GLOB STREQUAL ANDROID_GLOB-NOTFOUND) + message(FATAL_ERROR "Cannot find android-glob.") + endif() + + if(INTL STREQUAL INTL-NOTFOUND) + message(FATAL_ERROR "Cannot find libintl.") + endif() + endif() + find_library(UNWIND_GENERIC NAMES unwind-generic) target_link_libraries(coreclrpal - gcc_s - pthread - rt dl uuid ) - if(UNWIND STREQUAL UNWIND-NOTFOUND) - message(FATAL_ERROR "Cannot find libunwind. Try installing libunwind8-dev and libunwind8.") - endif(UNWIND STREQUAL UNWIND-NOTFOUND) - - target_link_libraries(coreclrpal ${UNWIND}) - if(NOT UNWIND_GENERIC STREQUAL UNWIND_GENERIC-NOTFOUND) target_link_libraries(coreclrpal ${UNWIND_GENERIC}) endif(NOT UNWIND_GENERIC STREQUAL UNWIND_GENERIC-NOTFOUND) diff --git a/src/pal/src/arch/amd64/processor.cpp b/src/pal/src/arch/amd64/processor.cpp index ac3d448..298d685 100644 --- a/src/pal/src/arch/amd64/processor.cpp +++ b/src/pal/src/arch/amd64/processor.cpp @@ -54,10 +54,18 @@ Return value: extern "C" unsigned int XmmYmmStateSupport() { unsigned int eax; - __asm(" xgetbv\n" \ - : "=a"(eax) /*output in eax*/\ - : "c"(0) /*inputs - 0 in ecx*/\ - : "eax", "edx" /* registers that are clobbered*/ + __asm(" mov $1, %%eax\n" \ + " cpuid\n" \ + " xor %%eax, %%eax\n" \ + " and $0x18000000, %%ecx\n" /* check for xsave feature set and that it is enabled by the OS */ \ + " cmp $0x18000000, %%ecx\n" \ + " jne end\n" \ + " xor %%ecx, %%ecx\n" \ + " xgetbv\n" \ + "end:\n" \ + : "=a"(eax) /* output in eax */ \ + : /* no inputs */ \ + : "eax", "ebx", "ecx", "edx" /* registers that are clobbered */ ); // Check OS has enabled both XMM and YMM state support return ((eax & 0x06) == 0x06) ? 1 : 0; diff --git a/src/pal/src/arch/i386/context2.S b/src/pal/src/arch/i386/context2.S index 16cbcc8..11aba5e 100644 --- a/src/pal/src/arch/i386/context2.S +++ b/src/pal/src/arch/i386/context2.S @@ -113,39 +113,22 @@ LOCAL_LABEL(Done_Restore_CONTEXT_FLOATING_POINT): movdqu xmm7, [eax + CONTEXT_Xmm7] LOCAL_LABEL(Done_Restore_CONTEXT_EXTENDED_REGISTERS): - // Restore CONTROL register(s) - mov ecx, [eax + CONTEXT_Eip] - mov [esp], ecx - - mov ecx, [eax + CONTEXT_Esp] - push ecx - mov ecx, [eax + CONTEXT_Ebp] - push ecx - - pop ebp - pop esp - - // Restore INTEGER register(s) - mov ecx, [eax + CONTEXT_Edi] - push ecx - mov ecx, [eax + CONTEXT_Esi] - push ecx - mov ecx, [eax + CONTEXT_Edx] - push ecx - mov ecx, [eax + CONTEXT_Ecx] - push ecx - mov ecx, [eax + CONTEXT_Ebx] - push ecx - mov ecx, [eax + CONTEXT_Eax] - push ecx + // Restore Stack + mov esp, [eax + CONTEXT_Esp] - pop eax - pop ebx - pop ecx - pop edx - pop esi - pop edi + // Create a minimal frame + push DWORD PTR [eax + CONTEXT_Eip] + + // Restore register(s) + mov ebp, [eax + CONTEXT_Ebp] + mov edi, [eax + CONTEXT_Edi] + mov esi, [eax + CONTEXT_Esi] + mov edx, [eax + CONTEXT_Edx] + mov ecx, [eax + CONTEXT_Ecx] + mov ebx, [eax + CONTEXT_Ebx] + mov eax, [eax + CONTEXT_Eax] - ret 8 + // Resume + ret LEAF_END RtlRestoreContext, _TEXT diff --git a/src/pal/src/config.h.in b/src/pal/src/config.h.in index 4d21fb7..77d7bfa 100644 --- a/src/pal/src/config.h.in +++ b/src/pal/src/config.h.in @@ -51,6 +51,7 @@ #cmakedefine01 HAVE_MACH_EXCEPTIONS #cmakedefine01 HAVE_VM_ALLOCATE #cmakedefine01 HAVE_VM_READ +#cmakedefine01 HAVE_SEMAPHORE_H #cmakedefine01 HAS_SYSV_SEMAPHORES #cmakedefine01 HAS_PTHREAD_MUTEXES #cmakedefine01 HAVE_TTRACE diff --git a/src/pal/src/configure.cmake b/src/pal/src/configure.cmake index a53e0db..4f2bc57 100644 --- a/src/pal/src/configure.cmake +++ b/src/pal/src/configure.cmake @@ -33,6 +33,7 @@ check_include_files(sys/lwp.h HAVE_SYS_LWP_H) check_include_files(lwp.h HAVE_LWP_H) check_include_files(libunwind.h HAVE_LIBUNWIND_H) check_include_files(runetype.h HAVE_RUNETYPE_H) +check_include_files(semaphore.h HAVE_SEMAPHORE_H) if(NOT CMAKE_SYSTEM_NAME STREQUAL FreeBSD AND NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD) set(CMAKE_REQUIRED_FLAGS "-ldl") @@ -48,15 +49,26 @@ check_include_files(gnu/lib-names.h HAVE_GNU_LIBNAMES_H) check_function_exists(kqueue HAVE_KQUEUE) check_function_exists(getpwuid_r HAVE_GETPWUID_R) -check_library_exists(pthread pthread_suspend "" HAVE_PTHREAD_SUSPEND) -check_library_exists(pthread pthread_suspend_np "" HAVE_PTHREAD_SUSPEND_NP) -check_library_exists(pthread pthread_continue "" HAVE_PTHREAD_CONTINUE) -check_library_exists(pthread pthread_continue_np "" HAVE_PTHREAD_CONTINUE_NP) -check_library_exists(pthread pthread_resume_np "" HAVE_PTHREAD_RESUME_NP) -check_library_exists(pthread pthread_attr_get_np "" HAVE_PTHREAD_ATTR_GET_NP) -check_library_exists(pthread pthread_getattr_np "" HAVE_PTHREAD_GETATTR_NP) -check_library_exists(pthread pthread_getcpuclockid "" HAVE_PTHREAD_GETCPUCLOCKID) -check_library_exists(pthread pthread_sigqueue "" HAVE_PTHREAD_SIGQUEUE) + +check_library_exists(pthread pthread_create "" HAVE_LIBPTHREAD) +check_library_exists(c pthread_create "" HAVE_PTHREAD_IN_LIBC) + +if (HAVE_LIBPTHREAD) + set(PTHREAD_LIBRARY pthread) +elseif (HAVE_PTHREAD_IN_LIBC) + set(PTHREAD_LIBRARY c) +endif() + +check_library_exists(${PTHREAD_LIBRARY} pthread_suspend "" HAVE_PTHREAD_SUSPEND) +check_library_exists(${PTHREAD_LIBRARY} pthread_suspend_np "" HAVE_PTHREAD_SUSPEND_NP) +check_library_exists(${PTHREAD_LIBRARY} pthread_continue "" HAVE_PTHREAD_CONTINUE) +check_library_exists(${PTHREAD_LIBRARY} pthread_continue_np "" HAVE_PTHREAD_CONTINUE_NP) +check_library_exists(${PTHREAD_LIBRARY} pthread_resume_np "" HAVE_PTHREAD_RESUME_NP) +check_library_exists(${PTHREAD_LIBRARY} pthread_attr_get_np "" HAVE_PTHREAD_ATTR_GET_NP) +check_library_exists(${PTHREAD_LIBRARY} pthread_getattr_np "" HAVE_PTHREAD_GETATTR_NP) +check_library_exists(${PTHREAD_LIBRARY} pthread_getcpuclockid "" HAVE_PTHREAD_GETCPUCLOCKID) +check_library_exists(${PTHREAD_LIBRARY} pthread_sigqueue "" HAVE_PTHREAD_SIGQUEUE) + check_function_exists(sigreturn HAVE_SIGRETURN) check_function_exists(_thread_sys_sigreturn HAVE__THREAD_SYS_SIGRETURN) set(CMAKE_REQUIRED_LIBRARIES m) @@ -874,7 +886,8 @@ int main(void) unlink(szFileName); exit(ret); }" UNGETC_NOT_RETURN_EOF) -set(CMAKE_REQUIRED_LIBRARIES pthread) + +set(CMAKE_REQUIRED_LIBRARIES ${PTHREAD_LIBRARY}) check_cxx_source_runs(" #include <stdlib.h> #include <errno.h> diff --git a/src/pal/src/cruntime/file.cpp b/src/pal/src/cruntime/file.cpp index 5fe2b67..0eb2cea 100644 --- a/src/pal/src/cruntime/file.cpp +++ b/src/pal/src/cruntime/file.cpp @@ -196,45 +196,6 @@ static BOOL WriteOnlyMode(FILE* pFile) /*++ Function: - _getw - -Gets an integer from a stream. - -Return Value - -_getw returns the integer value read. A return value of EOF indicates -either an error or end of file. However, because the EOF value is also -a legitimate integer value, use feof or ferror to verify an -end-of-file or error condition. - -Parameter - -file Pointer to FILE structure - ---*/ -int -__cdecl -_getw(PAL_FILE *f) -{ - INT ret = 0; - - PERF_ENTRY(_getw); - ENTRY("_getw (f=%p)\n", f); - - _ASSERTE(f != NULL); - - CLEARERR(f); - - ret = getw( f->bsdFilePtr ); - LOGEXIT( "returning %d\n", ret ); - PERF_EXIT(_getw); - - return ret; -} - - -/*++ -Function: _fdopen see MSDN @@ -448,45 +409,6 @@ _wfsopen( } /*++ -Function: - _putw - -Writes an integer to a stream. - -Return Value - -_putw returns the value written. A return value of EOF may indicate an -error. Because EOF is also a legitimate integer value, use ferror to -verify an error. - -Parameters - -c Binary integer to be output -file Pointer to FILE structure - ---*/ -int -__cdecl -_putw(int c, PAL_FILE *f) -{ - INT ret = 0; - - PERF_ENTRY(_putw); - ENTRY("_putw (c=0x%x, f=%p)\n", c, f); - - _ASSERTE(f != NULL); - - CLEARERR(f); - - ret = putw(c, f->bsdFilePtr ); - LOGEXIT( "returning %d\n", ret ); - PERF_EXIT(_putw); - - return ret; -} - - -/*++ Function PAL_get_stdout. diff --git a/src/pal/src/cruntime/math.cpp b/src/pal/src/cruntime/math.cpp index 08f4192..d53dbe7 100644 --- a/src/pal/src/cruntime/math.cpp +++ b/src/pal/src/cruntime/math.cpp @@ -66,11 +66,7 @@ int __cdecl _finite(double x) PERF_ENTRY(_finite); ENTRY("_finite (x=%f)\n", x); -#if defined(_IA64_) && defined (_HPUX_) - ret = !isnan(x) && (x != PAL_POSINF_DBL) && (x != PAL_NEGINF_DBL); -#else ret = isfinite(x); -#endif LOGEXIT("_finite returns int %d\n", ret); PERF_EXIT(_finite); @@ -452,11 +448,7 @@ int __cdecl _finitef(float x) PERF_ENTRY(_finitef); ENTRY("_finitef (x=%f)\n", x); -#if defined(_IA64_) && defined (_HPUX_) - ret = !isnan(x) && (x != PAL_POSINF_FLT) && (x != PAL_NEGINF_FLT); -#else ret = isfinite(x); -#endif LOGEXIT("_finitef returns int %d\n", ret); PERF_EXIT(_finitef); diff --git a/src/pal/src/cruntime/printf.cpp b/src/pal/src/cruntime/printf.cpp index c437b8e..72c7e11 100644 --- a/src/pal/src/cruntime/printf.cpp +++ b/src/pal/src/cruntime/printf.cpp @@ -1365,34 +1365,6 @@ int PAL_wvsscanf(LPCWSTR Buffer, LPCWSTR Format, va_list ap) /*++ Function: - PAL_swprintf - -See MSDN doc. ---*/ -int -__cdecl -PAL_swprintf( - wchar_16 *buffer, - const wchar_16 *format, - ...) -{ - LONG Length; - va_list ap; - - PERF_ENTRY(swprintf); - ENTRY("PAL_swprintf (buffer=%p, format=%p (%S))\n", buffer, format, format); - - va_start(ap, format); - Length = PAL__wvsnprintf(buffer, 0x7fffffff, format, ap); - va_end(ap); - - LOGEXIT("PAL_swprintf returns int %d\n", Length); - PERF_EXIT(swprintf); - return Length; -} - -/*++ -Function: PAL_swscanf See MSDN doc. @@ -1420,60 +1392,6 @@ PAL_swscanf( } -/*++ -Function: - PAL_vsprintf - -See MSDN doc. ---*/ -int -__cdecl -PAL_vsprintf(char *buffer, - const char *format, - va_list argptr) -{ - LONG Length; - - PERF_ENTRY(vsprintf); - ENTRY("PAL_vsprintf (buffer=%p, format=%p (%s), argptr=%p)\n", - buffer, format, format, argptr); - - Length = InternalVsnprintf(CorUnix::InternalGetCurrentThread(), buffer, 0x7fffffff, format, argptr); - - LOGEXIT("PAL_vsprintf returns int %d\n", Length); - PERF_EXIT(vsprintf); - - return Length; -} - - -/*++ -Function: - PAL_vswprintf - -See MSDN doc. ---*/ -int -__cdecl -PAL_vswprintf(wchar_16 *buffer, - const wchar_16 *format, - va_list argptr) -{ - LONG Length; - - PERF_ENTRY(vswprintf); - ENTRY("PAL_vswprintf (buffer=%p, format=%p (%S), argptr=%p)\n", - buffer, format, format, argptr); - - Length = PAL__wvsnprintf(buffer, 0x7fffffff, format, argptr); - - LOGEXIT("PAL_vswprintf returns int %d\n", Length); - PERF_EXIT(vswprintf); - - return Length; -} - - #if SSCANF_CANNOT_HANDLE_MISSING_EXPONENT /*++ Function: diff --git a/src/pal/src/cruntime/printfcpp.cpp b/src/pal/src/cruntime/printfcpp.cpp index ea074a6..0b90721 100644 --- a/src/pal/src/cruntime/printfcpp.cpp +++ b/src/pal/src/cruntime/printfcpp.cpp @@ -35,8 +35,9 @@ SET_DEFAULT_DEBUG_CHANNEL(CRT); using namespace CorUnix; -int CoreWvsnprintf(CPalThread *pthrCurrent, LPWSTR Buffer, size_t Count, LPCWSTR Format, va_list ap); -int CoreVsnprintf(CPalThread *pthrCurrent, LPSTR Buffer, size_t Count, LPCSTR Format, va_list ap); +static const char __nullstring[] = "(null)"; /* string to print on null ptr */ +static const WCHAR __wnullstring[] = W("(null)"); /* string to print on null ptr */ + int CoreVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const char *format, va_list ap); int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *format, va_list ap); @@ -865,7 +866,7 @@ Parameters: - padding style flags (PRINTF_FORMAT_FLAGS) *******************************************************************************/ -INT Internal_AddPaddingVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, LPSTR In, +INT Internal_AddPaddingVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, LPCSTR In, INT Padding, INT Flags) { LPSTR Out; @@ -1053,49 +1054,6 @@ static INT Internal_AddPaddingVfwprintf(CPalThread *pthrCurrent, PAL_FILE *strea /******************************************************************************* Function: - PAL_vsnprintf - -Parameters: - Buffer - - out buffer - Count - - buffer size - Format - - format string - ap - - stdarg parameter list -*******************************************************************************/ - -int __cdecl PAL__vsnprintf(LPSTR Buffer, size_t Count, LPCSTR Format, va_list ap) -{ - LONG Length; - - PERF_ENTRY(PAL__vsnprintf); - ENTRY("PAL__vsnprintf (buffer=%p, count=%d, format=%p (%s), argptr=%p)\n", - Buffer, Count, Format, Format, ap); - - Length = CoreVsnprintf(InternalGetCurrentThread(), Buffer, Count, Format, ap); - - LOGEXIT("PAL__vsnprintf returns int %d\n", Length); - PERF_EXIT(PAL__vsnprintf); - - return Length; -} - -/******************************************************************************* -Function: - PAL_wvsnprintf - - -- see PAL_vsnprintf above -*******************************************************************************/ - -int __cdecl PAL__wvsnprintf(LPWSTR Buffer, size_t Count, LPCWSTR Format, va_list ap) -{ - return CoreWvsnprintf(InternalGetCurrentThread(), Buffer, Count, Format, ap); -} - -/******************************************************************************* -Function: PAL_vfprintf Parameters: @@ -1132,31 +1090,17 @@ int __cdecl PAL_vfwprintf(PAL_FILE *stream, const wchar_16 *format, va_list ap) } // end extern "C" -int CorUnix::InternalWvsnprintf(CPalThread *pthrCurrent, LPWSTR Buffer, size_t Count, LPCWSTR Format, va_list ap) -{ - return CoreWvsnprintf(pthrCurrent, Buffer, Count, Format, ap); -} - -int CorUnix::InternalVsnprintf(CPalThread *pthrCurrent, LPSTR Buffer, size_t Count, LPCSTR Format, va_list ap) -{ - return CoreVsnprintf(pthrCurrent, Buffer, Count, Format, ap); -} - int CorUnix::InternalVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const char *format, va_list ap) { return CoreVfprintf(pthrCurrent, stream, format, ap); } -int CorUnix::InternalVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *format, va_list ap) -{ - return CoreVfwprintf(pthrCurrent, stream, format, ap); -} - int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *format, va_list aparg) { CHAR TempBuff[1024]; /* used to hold a single %<foo> format string */ LPCWSTR Fmt = format; - LPWSTR TempWStr = NULL; + LPCWSTR TempWStr = NULL; + LPWSTR AllocedTempWStr = NULL; LPWSTR WorkingWStr = NULL; WCHAR TempWChar[2]; INT Flags; @@ -1165,7 +1109,6 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for INT Prefix; INT Type; INT TempInt; - BOOL WStrWasMalloced = FALSE; int mbtowcResult; int written=0; int paddingReturnValue; @@ -1193,7 +1136,7 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for (Type == PFF_TYPE_STRING || Type == PFF_TYPE_WSTRING)) || (Type == PFF_TYPE_WSTRING && (Flags & PFF_ZERO) != 0)) { - WStrWasMalloced = FALSE; + AllocedTempWStr = NULL; if (WIDTH_STAR == Width) { @@ -1222,37 +1165,50 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for else { /* %lS assumes a LPSTR argument. */ - LPSTR s = va_arg(ap, LPSTR ); - UINT Length = 0; - Length = MultiByteToWideChar( CP_ACP, 0, s, -1, NULL, 0 ); - if ( Length != 0 ) + LPCSTR s = va_arg(ap, LPSTR ); + if (s == NULL) + { + TempWStr = NULL; + } + else { - TempWStr = - (LPWSTR)InternalMalloc( (Length) * sizeof( WCHAR ) ); - if ( TempWStr ) + UINT Length = 0; + Length = MultiByteToWideChar( CP_ACP, 0, s, -1, NULL, 0 ); + if ( Length != 0 ) { - WStrWasMalloced = TRUE; - MultiByteToWideChar( CP_ACP, 0, s, -1, - TempWStr, Length ); + AllocedTempWStr = + (LPWSTR)InternalMalloc( (Length) * sizeof( WCHAR ) ); + + if ( AllocedTempWStr ) + { + MultiByteToWideChar( CP_ACP, 0, s, -1, + AllocedTempWStr, Length ); + TempWStr = AllocedTempWStr; + } + else + { + ERROR( "InternalMalloc failed.\n" ); + LOGEXIT("vfwprintf returns int -1\n"); + PERF_EXIT(vfwprintf); + va_end(ap); + return -1; + } } else { - ERROR( "InternalMalloc failed.\n" ); + ASSERT( "Unable to convert from multibyte " + " to wide char.\n" ); LOGEXIT("vfwprintf returns int -1\n"); PERF_EXIT(vfwprintf); va_end(ap); return -1; } } - else - { - ASSERT( "Unable to convert from multibyte " - " to wide char.\n" ); - LOGEXIT("vfwprintf returns int -1\n"); - PERF_EXIT(vfwprintf); - va_end(ap); - return -1; - } + } + + if (TempWStr == NULL) + { + TempWStr = __wnullstring; } INT Length = PAL_wcslen(TempWStr); @@ -1263,10 +1219,7 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for LOGEXIT("vfwprintf returns int -1\n"); PERF_EXIT(vfwprintf); pthrCurrent->SetLastError(ERROR_NOT_ENOUGH_MEMORY); - if (WStrWasMalloced) - { - free(TempWStr); - } + free(AllocedTempWStr); va_end(ap); return -1; } @@ -1281,10 +1234,7 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for if (wcsncpy_s(WorkingWStr, (Length + 1), TempWStr, Precision+1) != SAFECRT_SUCCESS) { ERROR("Internal_AddPaddingVfwprintf failed\n"); - if (WStrWasMalloced) - { - free(TempWStr); - } + free(AllocedTempWStr); free(WorkingWStr); LOGEXIT("wcsncpy_s failed!\n"); PERF_EXIT(vfwprintf); @@ -1310,10 +1260,7 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for if (paddingReturnValue == -1) { ERROR("Internal_AddPaddingVfwprintf failed\n"); - if (WStrWasMalloced) - { - free(TempWStr); - } + free(AllocedTempWStr); free(WorkingWStr); LOGEXIT("vfwprintf returns int -1\n"); PERF_EXIT(vfwprintf); @@ -1323,10 +1270,7 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for written += paddingReturnValue; free(WorkingWStr); - if (WStrWasMalloced) - { - free(TempWStr); - } + free(AllocedTempWStr); } else if (Prefix == PFF_PREFIX_LONG && Type == PFF_TYPE_CHAR) { @@ -1466,7 +1410,7 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for va_list apcopy; va_copy(apcopy, ap); - TempInt = vsnprintf(TempSprintfStr, TEMP_COUNT, TempBuff, apcopy); + TempInt = _vsnprintf_s(TempSprintfStr, TEMP_COUNT, _TRUNCATE, TempBuff, apcopy); va_end(apcopy); PAL_printf_arg_remover(&ap, Width, Precision, Type, Prefix); @@ -1484,7 +1428,7 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for TempSprintfStr = TempSprintfStrPtr; va_copy(apcopy, ap); - vsnprintf(TempSprintfStr, TempInt, TempBuff, apcopy); + _vsnprintf_s(TempSprintfStr, TempInt, _TRUNCATE, TempBuff, apcopy); va_end(apcopy); PAL_printf_arg_remover(&ap, Width, Precision, Type, Prefix); } @@ -1581,669 +1525,11 @@ int CoreVfwprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const wchar_16 *for return (written); } -int CoreVsnprintf(CPalThread *pthrCurrent, LPSTR Buffer, size_t Count, LPCSTR Format, va_list aparg) -{ - BOOL BufferRanOut = FALSE; - CHAR TempBuff[1024]; /* used to hold a single %<foo> format string */ - LPSTR BufferPtr = Buffer; - LPCSTR Fmt = Format; - LPWSTR TempWStr; - LPSTR TempStr; - WCHAR TempWChar; - INT Flags; - INT Width; - INT Precision; - INT Prefix; - INT Type; - INT Length; - INT TempInt; - int wctombResult; - va_list ap; - - va_copy(ap, aparg); - - while (*Fmt) - { - if (BufferRanOut || (BufferPtr - Buffer) >= static_cast<int>(Count)) //Count is assumed to be in the range of int - { - BufferRanOut = TRUE; - break; - } - else if(*Fmt == '%' && - TRUE == Internal_ExtractFormatA(pthrCurrent, &Fmt, TempBuff, &Flags, - &Width, &Precision, - &Prefix, &Type)) - { - if (Prefix == PFF_PREFIX_LONG && Type == PFF_TYPE_STRING) - { - if (WIDTH_STAR == Width) - { - Width = va_arg(ap, INT); - } - else if (WIDTH_INVALID == Width) - { - /* both a '*' and a number, ignore, but remove arg */ - TempInt = va_arg(ap, INT); /* value not used */ - } - - if (PRECISION_STAR == Precision) - { - Precision = va_arg(ap, INT); - } - else if (PRECISION_INVALID == Precision) - { - /* both a '*' and a number, ignore, but remove arg */ - TempInt = va_arg(ap, INT); /* value not used */ - } - - TempWStr = va_arg(ap, LPWSTR); - Length = WideCharToMultiByte(CP_ACP, 0, TempWStr, -1, 0, - 0, 0, 0); - if (!Length) - { - ASSERT("WideCharToMultiByte failed. Error is %d\n", - GetLastError()); - va_end(ap); - return -1; - } - TempStr = (LPSTR) InternalMalloc(Length); - if (!TempStr) - { - ERROR("InternalMalloc failed\n"); - pthrCurrent->SetLastError(ERROR_NOT_ENOUGH_MEMORY); - va_end(ap); - return -1; - } - if (PRECISION_DOT == Precision) - { - /* copy nothing */ - *TempStr = 0; - Length = 0; - } - else if (Precision > 0 && Precision < Length - 1) - { - Length = WideCharToMultiByte(CP_ACP, 0, TempWStr, - Precision, TempStr, Length, - 0, 0); - if (!Length) - { - ASSERT("WideCharToMultiByte failed. Error is %d\n", - GetLastError()); - free(TempStr); - va_end(ap); - return -1; - } - TempStr[Length] = 0; - Length = Precision; - } - /* copy everything */ - else - { - wctombResult = WideCharToMultiByte(CP_ACP, 0, TempWStr, -1, - TempStr, Length, 0, 0); - if (!wctombResult) - { - ASSERT("WideCharToMultiByte failed. Error is %d\n", - GetLastError()); - free(TempStr); - va_end(ap); - return -1; - } - --Length; /* exclude null char */ - } - - /* do the padding (if needed)*/ - BufferRanOut = !Internal_AddPaddingA(&BufferPtr, - Count - (BufferPtr - Buffer), - TempStr, - Width - Length, - Flags); - - free(TempStr); - } - else if (Prefix == PFF_PREFIX_LONG && Type == PFF_TYPE_CHAR) - { - CHAR TempBuffer[5]; - - if (WIDTH_STAR == Width || - WIDTH_INVALID == Width) - { - /* ignore (because it's a char), and remove arg */ - TempInt = va_arg(ap, INT); /* value not used */ - } - if (PRECISION_STAR == Precision || - PRECISION_INVALID == Precision) - { - /* ignore (because it's a char), and remove arg */ - TempInt = va_arg(ap, INT); /* value not used */ - } - - TempWChar = va_arg(ap, int); - Length = WideCharToMultiByte(CP_ACP, 0, &TempWChar, 1, - TempBuffer, sizeof(TempBuffer), - 0, 0); - if (!Length) - { - ASSERT("WideCharToMultiByte failed. Error is %d\n", - GetLastError()); - va_end(ap); - return -1; - } - TempBuffer[Length] = 0; - - /* do the padding (if needed)*/ - BufferRanOut = !Internal_AddPaddingA(&BufferPtr, - Count - (BufferPtr - Buffer), - TempBuffer, - Width - Length, - Flags); - - } - /* this places the number of bytes written to the buffer in the - next arg */ - else if (Type == PFF_TYPE_N) - { - if (WIDTH_STAR == Width) - { - Width = va_arg(ap, INT); - } - if (PRECISION_STAR == Precision) - { - Precision = va_arg(ap, INT); - } - - if (Prefix == PFF_PREFIX_SHORT) - { - *(va_arg(ap, short *)) = BufferPtr - Buffer; - } - else - { - *(va_arg(ap, LPLONG)) = BufferPtr - Buffer; - } - } - else if (Type == PFF_TYPE_CHAR && (Flags & PFF_ZERO) != 0) - { - // Some versions of sprintf don't support 0-padded chars, - // so we handle them here. - char ch[2]; - - ch[0] = (char) va_arg(ap, int); - ch[1] = '\0'; - Length = 1; - BufferRanOut = !Internal_AddPaddingA(&BufferPtr, - Count - (BufferPtr - Buffer), - ch, - Width - Length, - Flags); - } - else if (Type == PFF_TYPE_STRING && (Flags & PFF_ZERO) != 0) - { - // Some versions of sprintf don't support 0-padded strings, - // so we handle them here. - char *tempStr; - - tempStr = va_arg(ap, char *); - Length = strlen(tempStr); - BufferRanOut = !Internal_AddPaddingA(&BufferPtr, - Count - (BufferPtr - Buffer), - tempStr, - Width - Length, - Flags); - } - else - { - // Types that sprintf can handle - size_t TempCount = Count - (BufferPtr - Buffer); - -#if !HAVE_LARGE_SNPRINTF_SUPPORT - // Limit TempCount to 0x40000000, which is sufficient - // for platforms on which snprintf fails for very large - // sizes. - if (TempCount > 0x40000000) - { - TempCount = 0x40000000; - } -#endif // HAVE_LARGE_SNPRINTF_SUPPORT - - TempInt = 0; - // %h (short) doesn't seem to be handled properly by local sprintf, - // so we do the truncation ourselves for some cases. - if (Type == PFF_TYPE_P && Prefix == PFF_PREFIX_SHORT) - { - // Convert from pointer -> int -> short to avoid warnings. - long trunc1; - short trunc2; - - trunc1 = va_arg(ap, LONG); - trunc2 = (short) trunc1; - trunc1 = trunc2; - - TempInt = snprintf(BufferPtr, TempCount, TempBuff, trunc1); - } - else if (Type == PFF_TYPE_INT && Prefix == PFF_PREFIX_SHORT) - { - // Convert explicitly from int to short to get - // correct sign extension for shorts on all systems. - int n; - short s; - - n = va_arg(ap, int); - s = (short) n; - - TempInt = snprintf(BufferPtr, TempCount, TempBuff, s); - } - else - { - va_list apcopy; - va_copy(apcopy, ap); - TempInt = vsnprintf(BufferPtr, TempCount, TempBuff, apcopy); - va_end(apcopy); - PAL_printf_arg_remover(&ap, Width, Precision, Type, Prefix); - } - - if (TempInt < 0 || static_cast<size_t>(TempInt) >= TempCount) /* buffer not long enough */ - { - BufferPtr += TempCount; - BufferRanOut = TRUE; - } - else - { - BufferPtr += TempInt; - } - } - } - else - { - *BufferPtr++ = *Fmt++; /* copy regular chars into buffer */ - } - } - - if (static_cast<int>(Count) > (BufferPtr - Buffer)) //Count is assumed to be in the range of int - { - *BufferPtr = 0; /* end the string */ - } - - va_end(ap); - - if (BufferRanOut) - { - errno = ERANGE; - return -1; - } - else - { - return BufferPtr - Buffer; - } -} - -int CoreWvsnprintf(CPalThread *pthrCurrent, LPWSTR Buffer, size_t Count, LPCWSTR Format, va_list aparg) -{ - BOOL BufferRanOut = FALSE; - CHAR TempBuff[1024]; /* used to hold a single %<foo> format string */ - LPWSTR BufferPtr = Buffer; - LPCWSTR Fmt = Format; - LPWSTR TempWStr = NULL; - LPWSTR WorkingWStr = NULL; - WCHAR TempWChar[2]; - INT Flags; - INT Width; - INT Precision; - INT Prefix; - INT Type; - INT TempInt; - LPSTR TempNumberBuffer; - int mbtowcResult; - va_list(ap); - - PERF_ENTRY(wvsnprintf); - ENTRY("wvsnprintf (buffer=%p, count=%u, format=%p (%S))\n", - Buffer, Count, Format, Format); - - va_copy(ap, aparg); - - while (*Fmt) - { - if (BufferRanOut || (BufferPtr - Buffer) >= static_cast<int>(Count)) //Count is assumed to be in the range of int - { - BufferRanOut = TRUE; - break; - } - else if(*Fmt == '%' && - TRUE == Internal_ExtractFormatW(pthrCurrent, &Fmt, TempBuff, &Flags, - &Width, &Precision, - &Prefix, &Type)) - { - if (((Prefix == PFF_PREFIX_LONG || Prefix == PFF_PREFIX_LONG_W) && - (Type == PFF_TYPE_STRING || Type == PFF_TYPE_WSTRING)) || - (Prefix == PFF_PREFIX_SHORT && Type == PFF_TYPE_STRING) || - (Type == PFF_TYPE_WSTRING && (Flags & PFF_ZERO) != 0)) - { - BOOL needToFree = FALSE; - - if (WIDTH_STAR == Width) - { - Width = va_arg(ap, INT); - } - else if (WIDTH_INVALID == Width) - { - /* both a '*' and a number, ignore, but remove arg */ - TempInt = va_arg(ap, INT); /* value not used */ - } - - if (PRECISION_STAR == Precision) - { - Precision = va_arg(ap, INT); - } - else if (PRECISION_INVALID == Precision) - { - /* both a '*' and a number, ignore, but remove arg */ - TempInt = va_arg(ap, INT); /* value not used */ - } - - if ((Type == PFF_TYPE_STRING && Prefix == PFF_PREFIX_LONG) || - Prefix == PFF_PREFIX_LONG_W) - { - TempWStr = va_arg(ap, LPWSTR); - } - else - { - // %lS and %hs assume an LPSTR argument. - LPSTR s = va_arg(ap, LPSTR ); - UINT Length = 0; - Length = MultiByteToWideChar( CP_ACP, 0, s, -1, NULL, 0 ); - if ( Length != 0 ) - { - TempWStr = - (LPWSTR)InternalMalloc((Length + 1 ) * sizeof( WCHAR ) ); - if ( TempWStr ) - { - needToFree = TRUE; - MultiByteToWideChar( CP_ACP, 0, s, -1, - TempWStr, Length ); - } - else - { - ERROR( "InternalMalloc failed.\n" ); - va_end(ap); - return -1; - } - } - else - { - ASSERT( "Unable to convert from multibyte " - " to wide char.\n" ); - va_end(ap); - return -1; - } - - } - - INT Length = PAL_wcslen(TempWStr); - WorkingWStr = (LPWSTR) InternalMalloc(sizeof(WCHAR) * (Length + 1)); - if (!WorkingWStr) - { - ERROR("InternalMalloc failed\n"); - pthrCurrent->SetLastError(ERROR_NOT_ENOUGH_MEMORY); - if (needToFree) - { - free(TempWStr); - } - va_end(ap); - return -1; - } - if (PRECISION_DOT == Precision) - { - // Copy nothing - *WorkingWStr = 0; - Length = 0; - } - else if (Precision > 0 && Precision < Length) - { - if (wcsncpy_s(WorkingWStr, (Length + 1), TempWStr, Precision+1) != SAFECRT_SUCCESS) - { - ERROR("CoreWvsnprintf failed\n"); - if (needToFree) - { - free(TempWStr); - } - free(WorkingWStr); - LOGEXIT("wcsncpy_s failed!\n"); - PERF_EXIT(wvsnprintf); - va_end(ap); - return (-1); - } - - Length = Precision; - } - else - { - // Copy everything - PAL_wcscpy(WorkingWStr, TempWStr); - } - - // Add padding if needed. - BufferRanOut = !Internal_AddPaddingW(&BufferPtr, - Count - (BufferPtr - Buffer), - WorkingWStr, - Width - Length, - Flags); - - if (needToFree) - { - free(TempWStr); - } - free(WorkingWStr); - } - else if (Prefix == PFF_PREFIX_LONG && Type == PFF_TYPE_CHAR) - { - if (WIDTH_STAR == Width || - WIDTH_INVALID == Width) - { - /* ignore (because it's a char), and remove arg */ - TempInt = va_arg(ap, INT); /* value not used */ - } - - if (PRECISION_STAR == Precision || - PRECISION_INVALID == Precision) - { - /* ignore (because it's a char), and remove arg */ - TempInt = va_arg(ap, INT); /* value not used */ - } - - TempWChar[0] = va_arg(ap, int); - TempWChar[1] = 0; - - /* do the padding (if needed)*/ - BufferRanOut = !Internal_AddPaddingW(&BufferPtr, - Count - (BufferPtr - Buffer), - TempWChar, - Width - 1, - Flags); - - } - /* this places the number of bytes written to the buffer in the - next arg */ - else if (Type == PFF_TYPE_N) - { - if (WIDTH_STAR == Width) - { - Width = va_arg(ap, INT); - } - if (PRECISION_STAR == Precision) - { - Precision = va_arg(ap, INT); - } - - if (Prefix == PFF_PREFIX_SHORT) - { - *(va_arg(ap, short *)) = BufferPtr - Buffer; - } - else - { - *(va_arg(ap, LPLONG)) = BufferPtr - Buffer; - } - } - else - { - // Types that sprintf can handle - - /* note: I'm using the wide buffer as a (char *) buffer when I - pass it to sprintf(). After I get the buffer back I make a - backup of the chars copied and then convert them to wide - and place them in the buffer (BufferPtr) */ - size_t TempCount = Count - (BufferPtr - Buffer); - TempInt = 0; - -#if !HAVE_LARGE_SNPRINTF_SUPPORT - // Limit TempCount to 0x40000000, which is sufficient - // for platforms on which snprintf fails for very large - // sizes. - if (TempCount > 0x40000000) - { - TempCount = 0x40000000; - } -#endif // HAVE_LARGE_SNPRINTF_SUPPORT - - // %h (short) doesn't seem to be handled properly by local sprintf, - // so we do the truncation ourselves for some cases. - if (Type == PFF_TYPE_P && Prefix == PFF_PREFIX_SHORT) - { - // Convert from pointer -> int -> short to avoid warnings. - long trunc1; - short trunc2; - - trunc1 = va_arg(ap, LONG); - trunc2 = (short)trunc1; - trunc1 = trunc2; - - TempInt = snprintf((LPSTR)BufferPtr, TempCount, TempBuff, trunc1); - } - else if (Type == PFF_TYPE_INT && Prefix == PFF_PREFIX_SHORT) - { - // Convert explicitly from int to short to get - // correct sign extension for shorts on all systems. - int n; - short s; - - n = va_arg(ap, int); - s = (short) n; - - TempInt = snprintf((LPSTR)BufferPtr, TempCount, TempBuff, s); - } - else - { - va_list apcopy; - va_copy(apcopy, ap); - TempInt = vsnprintf((LPSTR) BufferPtr, TempCount, TempBuff, apcopy); - va_end(apcopy); - PAL_printf_arg_remover(&ap, Width, Precision, Type, Prefix); - } - - if (TempInt == 0) - { - // The argument is "". - continue; - } - if (TempInt < 0 || static_cast<size_t>(TempInt) >= TempCount) /* buffer not long enough */ - { - TempNumberBuffer = (LPSTR) InternalMalloc(TempCount+1); - if (!TempNumberBuffer) - { - ERROR("InternalMalloc failed\n"); - pthrCurrent->SetLastError(ERROR_NOT_ENOUGH_MEMORY); - errno = ENOMEM; - va_end(ap); - return -1; - } - - if (strncpy_s(TempNumberBuffer, TempCount+1, (LPSTR) BufferPtr, TempCount) != SAFECRT_SUCCESS) - { - ASSERT("strncpy_s failed!\n"); - free(TempNumberBuffer); - va_end(ap); - return -1; - } - - mbtowcResult = MultiByteToWideChar(CP_ACP, 0, - TempNumberBuffer, - TempCount, - BufferPtr, TempCount); - if (!mbtowcResult) - { - ASSERT("MultiByteToWideChar failed. Error is %d\n", - GetLastError()); - free(TempNumberBuffer); - va_end(ap); - return -1; - } - BufferPtr += TempCount; - BufferRanOut = TRUE; - } - else - { - TempNumberBuffer = (LPSTR) InternalMalloc(TempInt+1); - if (!TempNumberBuffer) - { - ERROR("InternalMalloc failed\n"); - pthrCurrent->SetLastError(ERROR_NOT_ENOUGH_MEMORY); - va_end(ap); - return -1; - } - - if (strncpy_s(TempNumberBuffer, TempInt+1, (LPSTR) BufferPtr, TempInt) != SAFECRT_SUCCESS) - { - ASSERT("strncpy_s failed!\n"); - free(TempNumberBuffer); - va_end(ap); - return -1; - } - - mbtowcResult = MultiByteToWideChar(CP_ACP, 0, - TempNumberBuffer, - TempInt, - BufferPtr, TempInt); - if (!mbtowcResult) - { - ASSERT("MultiByteToWideChar failed. Error is %d\n", - GetLastError()); - free(TempNumberBuffer); - va_end(ap); - return -1; - } - BufferPtr += TempInt; - } - free(TempNumberBuffer); - } - } - else - { - *BufferPtr++ = *Fmt++; /* copy regular chars into buffer */ - } - } - - if (static_cast<int>(Count) > (BufferPtr - Buffer)) //Count is assumed to be in the range of int - { - *BufferPtr = 0; /* end the string */ - } - - va_end(ap); - - if (BufferRanOut) - { - errno = ERANGE; - return -1; - } - else - { - return BufferPtr - Buffer; - } -} - int CoreVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const char *format, va_list aparg) { CHAR TempBuff[1024]; /* used to hold a single %<foo> format string */ LPCSTR Fmt = format; - LPWSTR TempWStr; + LPCWSTR TempWStr; LPSTR TempStr; WCHAR TempWChar; INT Flags; @@ -2292,6 +1578,10 @@ int CoreVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const char *format, } TempWStr = va_arg(ap, LPWSTR); + if (TempWStr == NULL)\ + { + TempWStr = __wnullstring; + } Length = WideCharToMultiByte(CP_ACP, 0, TempWStr, -1, 0, 0, 0, 0); if (!Length) @@ -2461,9 +1751,13 @@ int CoreVfprintf(CPalThread *pthrCurrent, PAL_FILE *stream, const char *format, { // Some versions of fprintf don't support 0-padded strings, // so we handle them here. - char *tempStr; + const char *tempStr; tempStr = va_arg(ap, char *); + if (tempStr == NULL) + { + tempStr = __nullstring; + } Length = strlen(tempStr); paddingReturnValue = Internal_AddPaddingVfprintf( pthrCurrent, diff --git a/src/pal/src/cruntime/silent_printf.cpp b/src/pal/src/cruntime/silent_printf.cpp index 1d10963..4047c7e 100644 --- a/src/pal/src/cruntime/silent_printf.cpp +++ b/src/pal/src/cruntime/silent_printf.cpp @@ -40,286 +40,6 @@ static INT Silent_AddPaddingVfprintf(PAL_FILE *stream, LPSTR In, INT Padding, static size_t Silent_PAL_wcslen(const wchar_16 *string); -/******************************************************************************* -Function: - PAL_vsnprintf (silent version) - for more details, see PAL_vsnprintf in printf.c -*******************************************************************************/ -INT Silent_PAL_vsnprintf(LPSTR Buffer, INT Count, LPCSTR Format, va_list aparg) -{ - BOOL BufferRanOut = FALSE; - CHAR TempBuff[1024]; /* used to hold a single %<foo> format string */ - LPSTR BufferPtr = Buffer; - LPCSTR Fmt = Format; - LPWSTR TempWStr; - CHAR TempStr[MAX_STR_LEN+1]; - WCHAR TempWChar; - INT Flags; - INT Width; - INT Precision; - INT Prefix; - INT Type; - INT Length; - INT TempInt; - int wctombResult; - va_list ap; - - va_copy(ap, aparg); - - while (*Fmt) - { - if ((BufferPtr - Buffer) >= Count) - { - BufferRanOut = TRUE; - break; - } - else if(*Fmt == '%' && - TRUE == Silent_ExtractFormatA(&Fmt, TempBuff, &Flags, - &Width, &Precision, - &Prefix, &Type)) - { - if (Prefix == PFF_PREFIX_LONG && Type == PFF_TYPE_STRING) - { - if (WIDTH_STAR == Width) - { - Width = va_arg(ap, INT); - } - else if (WIDTH_INVALID == Width) - { - /* both a '*' and a number, ignore, but remove arg */ - TempInt = va_arg(ap, INT); /* value not used */ - } - - if (PRECISION_STAR == Precision) - { - Precision = va_arg(ap, INT); - } - else if (PRECISION_INVALID == Precision) - { - /* both a '*' and a number, ignore, but remove arg */ - TempInt = va_arg(ap, INT); /* value not used */ - } - - TempWStr = va_arg(ap, LPWSTR); - Length = Silent_WideCharToMultiByte(TempWStr, -1, 0, 0); - if (!Length) - { - va_end(ap); - return -1; - } - - /* clip string output to MAX_STR_LEN characters */ - if (PRECISION_DOT == Precision) - { - Precision = MAX_STR_LEN; - } - - if (PRECISION_DOT == Precision) - { - /* copy nothing */ - *TempStr = 0; - Length = 0; - } - else if (Precision > 0 && Precision < Length - 1) - { - Length = Silent_WideCharToMultiByte(TempWStr, Precision, - TempStr, Length); - if (!Length) - { - va_end(ap); - return -1; - } - TempStr[Length] = 0; - Length = Precision; - } - /* copy everything */ - else - { - wctombResult = Silent_WideCharToMultiByte(TempWStr, -1, - TempStr, Length); - if (!wctombResult) - { - PAL_free(TempStr); - va_end(ap); - return -1; - } - --Length; /* exclude null char */ - } - - /* do the padding (if needed)*/ - BufferRanOut = !Internal_AddPaddingA(&BufferPtr, - Count - (BufferPtr - Buffer), - TempStr, - Width - Length, - Flags); - } - else if (Prefix == PFF_PREFIX_LONG && Type == PFF_TYPE_CHAR) - { - CHAR TempBuffer[4]; - - if (WIDTH_STAR == Width || - WIDTH_INVALID == Width) - { - /* ignore (because it's a char), and remove arg */ - TempInt = va_arg(ap, INT); /* value not used */ - } - if (PRECISION_STAR == Precision || - PRECISION_INVALID == Precision) - { - /* ignore (because it's a char), and remove arg */ - TempInt = va_arg(ap, INT); /* value not used */ - } - - TempWChar = va_arg(ap, int); - Length = Silent_WideCharToMultiByte(&TempWChar, 1, TempBuffer, 4); - if (!Length) - { - va_end(ap); - return -1; - } - TempBuffer[Length] = 0; - - /* do the padding (if needed)*/ - BufferRanOut = !Internal_AddPaddingA(&BufferPtr, - Count - (BufferPtr - Buffer), - TempBuffer, - Width - Length, - Flags); - - } - /* this places the number of bytes written to the buffer in the - next arg */ - else if (Type == PFF_TYPE_N) - { - if (WIDTH_STAR == Width) - { - Width = va_arg(ap, INT); - } - if (PRECISION_STAR == Precision) - { - Precision = va_arg(ap, INT); - } - if (Prefix == PFF_PREFIX_SHORT) - { - *(va_arg(ap, short *)) = BufferPtr - Buffer; - } - else - { - *(va_arg(ap, LPLONG)) = BufferPtr - Buffer; - } - } - else if (Type == PFF_TYPE_CHAR && (Flags & PFF_ZERO) != 0) - { - // Some versions of sprintf don't support 0-padded chars, - // so we handle them here. - char ch[2]; - - ch[0] = (char) va_arg(ap, int); - ch[1] = '\0'; - Length = 1; - BufferRanOut = !Internal_AddPaddingA(&BufferPtr, - Count - (BufferPtr - Buffer), - ch, - Width - Length, - Flags); - } - else if (Type == PFF_TYPE_STRING && (Flags & PFF_ZERO) != 0) - { - // Some versions of sprintf don't support 0-padded strings, - // so we handle them here. - char *tempStr; - - tempStr = va_arg(ap, char *); - Length = strlen(tempStr); - BufferRanOut = !Internal_AddPaddingA(&BufferPtr, - Count - (BufferPtr - Buffer), - tempStr, - Width - Length, - Flags); - } - /* types that sprintf can handle */ - else - { - size_t TempCount = Count - (BufferPtr - Buffer); - - TempInt = 0; - /* %h (short) doesn't seem to be handled properly by local sprintf, - so lets do the truncation ourselves. (ptr -> int -> short to avoid - warnings */ - if (Type == PFF_TYPE_P && Prefix == PFF_PREFIX_SHORT) - { - long trunc1; - short trunc2; - - trunc1 = va_arg(ap, LONG); - trunc2 = (short)trunc1; - - TempInt = snprintf(BufferPtr, TempCount, TempBuff, trunc2); - } - else if (Type == PFF_TYPE_INT && Prefix == PFF_PREFIX_SHORT) - { - // Convert explicitly from int to short to get - // correct sign extension for shorts on all systems. - int n; - short s; - - n = va_arg(ap, int); - s = (short) n; - - TempInt = snprintf(BufferPtr, TempCount, TempBuff, s); - } - else - { - /* limit string output (%s) to 300 characters */ - if(TempBuff[0] == '%' && TempBuff[1] == 's') - { - if (strcpy_s(TempBuff, sizeof(TempBuff), "%.300s") != SAFECRT_SUCCESS) - { - va_end(ap); - return -1; - } - } - va_list apcopy; - va_copy(apcopy, ap); - TempInt = InternalVsnprintf(CorUnix::InternalGetCurrentThread(), BufferPtr, TempCount, TempBuff, apcopy); - va_end(apcopy); - PAL_printf_arg_remover(&ap, Width, Precision, Type, Prefix); - } - - if (TempInt < 0 || static_cast<size_t>(TempInt) >= TempCount) /* buffer not long enough */ - { - BufferPtr += TempCount; - BufferRanOut = TRUE; - } - else - { - BufferPtr += TempInt; - } - } - } - else - { - *BufferPtr++ = *Fmt++; /* copy regular chars into buffer */ - } - } - - if (Count > (BufferPtr - Buffer)) - { - *BufferPtr = 0; /* end the string */ - } - - va_end(ap); - - if (BufferRanOut) - { - return -1; - } - else - { - return BufferPtr - Buffer; - } -} - /*++ Function: PAL_vfprintf (silent version) diff --git a/src/pal/src/cruntime/string.cpp b/src/pal/src/cruntime/string.cpp index abe6d13..2abce6f 100644 --- a/src/pal/src/cruntime/string.cpp +++ b/src/pal/src/cruntime/string.cpp @@ -278,7 +278,7 @@ PAL_atol(const char *szNumber) PERF_ENTRY(atol); ENTRY("atol (szNumber=%p (%s))\n", - szNumber?szNumber:"NULL" + szNumber, szNumber?szNumber:"NULL" ); lResult = atol(szNumber); diff --git a/src/pal/src/debug/debug.cpp b/src/pal/src/debug/debug.cpp index 2f7d17c..2eaaec9 100644 --- a/src/pal/src/debug/debug.cpp +++ b/src/pal/src/debug/debug.cpp @@ -545,254 +545,6 @@ SetThreadContext( /*++ Function: - PAL_CreateExecWatchpoint - -Abstract - Creates an OS exec watchpoint for the specified instruction - and thread. This function should only be called on architectures - that do not support a hardware single-step mode (e.g., SPARC). - -Parameter - hThread : the thread for which the watchpoint is to apply - pvInstruction : the instruction on which the watchpoint is to be set - -Return - A Win32 error code ---*/ - -DWORD -PAL_CreateExecWatchpoint( - HANDLE hThread, - PVOID pvInstruction - ) -{ - PERF_ENTRY(PAL_CreateExecWatchpoint); - ENTRY("PAL_CreateExecWatchpoint (hThread=%p, pvInstruction=%p)\n", hThread, pvInstruction); - - DWORD dwError = ERROR_NOT_SUPPORTED; - -#if HAVE_PRWATCH_T - - CPalThread *pThread = NULL; - CPalThread *pTargetThread = NULL; - IPalObject *pobjThread = NULL; - int fd = -1; - char ctlPath[50]; - - struct - { - long ctlCode; - prwatch_t prwatch; - } ctlStruct; - - // - // We must never set a watchpoint on an instruction that enters a syscall; - // if such a request comes in we succeed it w/o actually creating the - // watchpoint. This mirrors the behavior of setting the single-step flag - // in a thread context when the thread is w/in a system service -- the - // flag is ignored and will not be present when the thread returns - // to user mode. - // - -#if defined(_SPARC_) - if (*(DWORD*)pvInstruction == 0x91d02008) // ta 8 - { - TRACE("Watchpoint requested on sysenter instruction -- ignoring"); - dwError = ERROR_SUCCESS; - goto PAL_CreateExecWatchpointExit; - } -#else -#error Need syscall instruction for this platform -#endif // _SPARC_ - - pThread = InternalGetCurrentThread(); - - dwError = InternalGetThreadDataFromHandle( - pThread, - hThread, - 0, // THREAD_SET_CONTEXT - &pTargetThread, - &pobjThread - ); - - if (NO_ERROR != dwError) - { - goto PAL_CreateExecWatchpointExit; - } - - snprintf(ctlPath, sizeof(ctlPath), "/proc/%u/lwp/%u/lwpctl", getpid(), pTargetThread->GetLwpId()); - - fd = InternalOpen(pThread, ctlPath, O_WRONLY); - if (-1 == fd) - { - ERROR("Failed to open %s\n", ctlPath); - dwError = ERROR_INVALID_ACCESS; - goto PAL_CreateExecWatchpointExit; - } - - ctlStruct.ctlCode = PCWATCH; - ctlStruct.prwatch.pr_vaddr = (uintptr_t) pvInstruction; - ctlStruct.prwatch.pr_size = sizeof(DWORD); - ctlStruct.prwatch.pr_wflags = WA_EXEC | WA_TRAPAFTER; - - if (write(fd, (void*) &ctlStruct, sizeof(ctlStruct)) != sizeof(ctlStruct)) - { - ERROR("Failure writing control structure (errno = %u)\n", errno); - dwError = ERROR_INTERNAL_ERROR; - goto PAL_CreateExecWatchpointExit; - } - - dwError = ERROR_SUCCESS; - -PAL_CreateExecWatchpointExit: - - if (NULL != pobjThread) - { - pobjThread->ReleaseReference(pThread); - } - - if (-1 != fd) - { - close(fd); - } - -#endif // HAVE_PRWATCH_T - - LOGEXIT("PAL_CreateExecWatchpoint returns ret:%d\n", dwError); - PERF_EXIT(PAL_CreateExecWatchpoint); - return dwError; -} - -/*++ -Function: - PAL_DeleteExecWatchpoint - -Abstract - Deletes an OS exec watchpoint for the specified instruction - and thread. This function should only be called on architectures - that do not support a hardware single-step mode (e.g., SPARC). - -Parameter - hThread : the thread to remove the watchpoint from - pvInstruction : the instruction for which the watchpoint is to be removed - -Return - A Win32 error code. Attempting to delete a watchpoint that does not exist - may or may not result in an error, depending on the behavior of the - underlying operating system. ---*/ - -DWORD -PAL_DeleteExecWatchpoint( - HANDLE hThread, - PVOID pvInstruction - ) -{ - PERF_ENTRY(PAL_DeleteExecWatchpoint); - ENTRY("PAL_DeleteExecWatchpoint (hThread=%p, pvInstruction=%p)\n", hThread, pvInstruction); - - DWORD dwError = ERROR_NOT_SUPPORTED; - -#if HAVE_PRWATCH_T - - CPalThread *pThread = NULL; - CPalThread *pTargetThread = NULL; - IPalObject *pobjThread = NULL; - int fd = -1; - char ctlPath[50]; - - struct - { - long ctlCode; - prwatch_t prwatch; - } ctlStruct; - - - pThread = InternalGetCurrentThread(); - - dwError = InternalGetThreadDataFromHandle( - pThread, - hThread, - 0, // THREAD_SET_CONTEXT - &pTargetThread, - &pobjThread - ); - - if (NO_ERROR != dwError) - { - goto PAL_DeleteExecWatchpointExit; - } - - snprintf(ctlPath, sizeof(ctlPath), "/proc/%u/lwp/%u/lwpctl", getpid(), pTargetThread->GetLwpId()); - - fd = InternalOpen(pThread, ctlPath, O_WRONLY); - if (-1 == fd) - { - ERROR("Failed to open %s\n", ctlPath); - dwError = ERROR_INVALID_ACCESS; - goto PAL_DeleteExecWatchpointExit; - } - - ctlStruct.ctlCode = PCWATCH; - ctlStruct.prwatch.pr_vaddr = (uintptr_t) pvInstruction; - ctlStruct.prwatch.pr_size = sizeof(DWORD); - ctlStruct.prwatch.pr_wflags = 0; - - if (write(fd, (void*) &ctlStruct, sizeof(ctlStruct)) != sizeof(ctlStruct)) - { - ERROR("Failure writing control structure (errno = %u)\n", errno); - dwError = ERROR_INTERNAL_ERROR; - goto PAL_DeleteExecWatchpointExit; - } - - dwError = ERROR_SUCCESS; - -PAL_DeleteExecWatchpointExit: - - if (NULL != pobjThread) - { - pobjThread->ReleaseReference(pThread); - } - - if (-1 != fd) - { - close(fd); - } - -#endif // HAVE_PRWATCH_T - - LOGEXIT("PAL_DeleteExecWatchpoint returns ret:%d\n", dwError); - PERF_EXIT(PAL_DeleteExecWatchpoint); - return dwError; -} - -__attribute__((noinline)) -__attribute__((optnone)) -void -ProbeMemory(volatile PBYTE pbBuffer, DWORD cbBuffer, bool fWriteAccess) -{ - // Need an throw in this function to fool the C++ runtime into handling the - // possible h/w exception below. - if (pbBuffer == NULL) - { - throw PAL_SEHException(); - } - - // Simple one byte at a time probing - while (cbBuffer > 0) - { - volatile BYTE read = *pbBuffer; - if (fWriteAccess) - { - *pbBuffer = read; - } - ++pbBuffer; - --cbBuffer; - } -} - -/*++ -Function: PAL_ProbeMemory Abstract @@ -812,18 +564,58 @@ PAL_ProbeMemory( DWORD cbBuffer, BOOL fWriteAccess) { - try - { - // Need to explicit h/w exception holder so to catch them in ProbeMemory - CatchHardwareExceptionHolder __catchHardwareException; + int fds[2]; - ProbeMemory((PBYTE)pBuffer, cbBuffer, fWriteAccess); - } - catch(...) + if (pipe(fds) != 0) { + ASSERT("pipe failed: errno is %d (%s)\n", errno, strerror(errno)); return FALSE; } - return TRUE; + + fcntl(fds[0], O_NONBLOCK); + fcntl(fds[1], O_NONBLOCK); + + PVOID pEnd = (PBYTE)pBuffer + cbBuffer; + BOOL result = TRUE; + + // Validate the first byte in the buffer, then validate the first byte on each page after that. + while (pBuffer < pEnd) + { + int written = write(fds[1], pBuffer, 1); + if (written == -1) + { + if (errno != EFAULT) + { + ASSERT("write failed: errno is %d (%s)\n", errno, strerror(errno)); + } + result = FALSE; + break; + } + else + { + if (fWriteAccess) + { + int rd = read(fds[0], pBuffer, 1); + if (rd == -1) + { + if (errno != EFAULT) + { + ASSERT("read failed: errno is %d (%s)\n", errno, strerror(errno)); + } + result = FALSE; + break; + } + } + } + + // Round to the beginning of the next page + pBuffer = (PVOID)(((SIZE_T)pBuffer & ~VIRTUAL_PAGE_MASK) + VIRTUAL_PAGE_SIZE); + } + + close(fds[0]); + close(fds[1]); + + return result; } } // extern "C" diff --git a/src/pal/src/exception/machexception.h b/src/pal/src/exception/machexception.h index 18e3150..e2f8ee7 100644 --- a/src/pal/src/exception/machexception.h +++ b/src/pal/src/exception/machexception.h @@ -25,8 +25,6 @@ extern "C" { #endif // __cplusplus -#define HIJACK_ON_SIGNAL 1 - // List of exception types we will be watching for // NOTE: if you change any of these, you need to adapt s_nMachExceptionPortsMax in thread.hpp #define PAL_EXC_ILLEGAL_MASK (EXC_MASK_BAD_INSTRUCTION | EXC_MASK_EMULATION) diff --git a/src/pal/src/exception/seh-unwind.cpp b/src/pal/src/exception/seh-unwind.cpp index fa2f109..e3fa09f 100644 --- a/src/pal/src/exception/seh-unwind.cpp +++ b/src/pal/src/exception/seh-unwind.cpp @@ -322,14 +322,14 @@ BOOL PAL_VirtualUnwind(CONTEXT *context, KNONVOLATILE_CONTEXT_POINTERS *contextP if (unw_is_signal_frame(&cursor) > 0) { context->ContextFlags |= CONTEXT_EXCEPTION_ACTIVE; -#if defined(_ARM_) || defined(_ARM64_) +#if defined(_ARM_) || defined(_ARM64_) || defined(_X86_) context->ContextFlags &= ~CONTEXT_UNWOUND_TO_CALL; #endif // _ARM_ || _ARM64_ } else { context->ContextFlags &= ~CONTEXT_EXCEPTION_ACTIVE; -#if defined(_ARM_) || defined(_ARM64_) +#if defined(_ARM_) || defined(_ARM64_) || defined(_X86_) context->ContextFlags |= CONTEXT_UNWOUND_TO_CALL; #endif // _ARM_ || _ARM64_ } diff --git a/src/pal/src/exception/signal.hpp b/src/pal/src/exception/signal.hpp index c0c950e..cd019e6 100644 --- a/src/pal/src/exception/signal.hpp +++ b/src/pal/src/exception/signal.hpp @@ -46,13 +46,6 @@ Function : --*/ void SEHCleanupSignals(); -#if (__GNUC__ > 3 || \ - (__GNUC__ == 3 && __GNUC_MINOR__ > 2)) -// For gcc > 3.2, sjlj exceptions semantics are no longer available -// Therefore we need to hijack out of signal handlers before second pass -#define HIJACK_ON_SIGNAL 1 -#endif - #endif // !HAVE_MACH_EXCEPTIONS #endif /* _PAL_SIGNAL_HPP_ */ diff --git a/src/pal/src/file/disk.cpp b/src/pal/src/file/disk.cpp index ef1d488..08880c9 100644 --- a/src/pal/src/file/disk.cpp +++ b/src/pal/src/file/disk.cpp @@ -26,10 +26,7 @@ Revision History: #include "pal/stackstring.hpp" #include <sys/param.h> -#if !defined(_AIX) -// do we actually need this on other platforms. We don't seem to be using anything from there #include <sys/mount.h> -#endif #include <errno.h> #if HAVE_STATVFS #include <sys/types.h> diff --git a/src/pal/src/file/file.cpp b/src/pal/src/file/file.cpp index 6443a5e..d70e62b 100644 --- a/src/pal/src/file/file.cpp +++ b/src/pal/src/file/file.cpp @@ -18,6 +18,9 @@ Abstract: --*/ +#include "pal/dbgmsg.h" +SET_DEFAULT_DEBUG_CHANNEL(FILE); // some headers have code with asserts, so do this first + #include "pal/thread.hpp" #include "pal/file.hpp" #include "shmfilelockmgr.hpp" @@ -25,7 +28,6 @@ Abstract: #include "pal/stackstring.hpp" #include "pal/palinternal.h" -#include "pal/dbgmsg.h" #include "pal/file.h" #include "pal/filetime.h" #include "pal/utils.h" @@ -42,8 +44,6 @@ Abstract: using namespace CorUnix; -SET_DEFAULT_DEBUG_CHANNEL(FILE); - int MaxWCharToAcpLengthFactor = 3; PAL_ERROR @@ -3657,12 +3657,9 @@ DWORD FILEGetLastErrorFromErrno( void ) case EEXIST: dwRet = ERROR_ALREADY_EXISTS; break; -#if !defined(_AIX) - // ENOTEMPTY is the same as EEXIST on AIX. Meaningful when involving directory operations case ENOTEMPTY: dwRet = ERROR_DIR_NOT_EMPTY; break; -#endif case EBADF: dwRet = ERROR_INVALID_HANDLE; break; diff --git a/src/pal/src/file/path.cpp b/src/pal/src/file/path.cpp index c4ef31b..d998b72 100644 --- a/src/pal/src/file/path.cpp +++ b/src/pal/src/file/path.cpp @@ -494,8 +494,8 @@ GetTempPathA( } else /* env var not found or was empty */ { - /* no luck, use /tmp/ */ - const char *defaultDir = "/tmp/"; + /* no luck, use /tmp/ or /data/local/tmp on Android */ + const char *defaultDir = TEMP_DIRECTORY_PATH; int defaultDirLen = strlen(defaultDir); if (defaultDirLen < nBufferLength) { diff --git a/src/pal/src/include/pal/modulename.h b/src/pal/src/include/pal/modulename.h index 70b0a61..20001f8 100644 --- a/src/pal/src/include/pal/modulename.h +++ b/src/pal/src/include/pal/modulename.h @@ -28,9 +28,6 @@ extern "C" #endif // __cplusplus const char *PAL_dladdr(LPVOID ProcAddress); -#if defined(_AIX) -int GetLibRotorNameViaLoadQuery(LPSTR pszBuf); -#endif #ifdef __cplusplus } diff --git a/src/pal/src/include/pal/palinternal.h b/src/pal/src/include/pal/palinternal.h index f7856be..48e2f3c 100644 --- a/src/pal/src/include/pal/palinternal.h +++ b/src/pal/src/include/pal/palinternal.h @@ -335,7 +335,7 @@ function_name() to call the system's implementation #undef va_arg #endif -#if !defined(_MSC_VER) && defined(FEATURE_PAL) && defined(_WIN64) +#if !defined(_MSC_VER) && defined(_WIN64) #undef _BitScanForward64 #endif @@ -358,6 +358,7 @@ function_name() to call the system's implementation #undef memchr #undef strlen #undef strnlen +#undef wcsnlen #undef stricmp #undef strstr #undef strcmp @@ -502,7 +503,6 @@ function_name() to call the system's implementation #undef vfwprintf #undef vprintf #undef wprintf -#undef swprintf #undef wcstod #undef wcstol #undef wcstoul @@ -525,10 +525,6 @@ function_name() to call the system's implementation #undef iswspace #undef towlower #undef towupper -#undef vsprintf -#undef vswprintf -#undef _vsnprintf -#undef vsnprintf #undef wvsnprintf #ifdef _AMD64_ @@ -606,15 +602,19 @@ function_name() to call the system's implementation #define INFTIM -1 #endif // !HAVE_INFTIM -#if (__GNUC__ >= 4) #define OffsetOf(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) -#else -#define OffsetOf(s, f) (INT)(SIZE_T)&(((s*)0)->f) -#endif /* __GNUC__ version check*/ #undef assert #define assert (Use__ASSERTE_instead_of_assert) assert +#ifndef __ANDROID__ +#define TEMP_DIRECTORY_PATH "/tmp/" +#else +// On Android, "/tmp/" doesn't exist; temporary files should go to +// /data/local/tmp/ +#define TEMP_DIRECTORY_PATH "/data/local/tmp/" +#endif + #define PROCESS_PIPE_NAME_PREFIX ".dotnet-pal-processpipe" #ifdef __cplusplus diff --git a/src/pal/src/include/pal/printfcpp.hpp b/src/pal/src/include/pal/printfcpp.hpp index 0a728c9..12e923a 100644 --- a/src/pal/src/include/pal/printfcpp.hpp +++ b/src/pal/src/include/pal/printfcpp.hpp @@ -32,22 +32,6 @@ typedef char16_t wchar_16; // __wchar_16_cpp (which is defined in palinternal.h) extern "C" { int - __cdecl - PAL__vsnprintf( - LPSTR Buffer, - size_t Count, - LPCSTR Format, - va_list ap); - - int - __cdecl - PAL__wvsnprintf( - LPWSTR Buffer, - size_t Count, - LPCWSTR Format, - va_list ap); - - int __cdecl PAL_vfprintf( PAL_FILE *stream, @@ -71,48 +55,9 @@ namespace CorUnix const char *format, va_list ap); - int - InternalWvsnprintf( - CPalThread *pthrCurrent, - LPWSTR Buffer, - size_t Count, - LPCWSTR Format, - va_list ap); - - int - InternalVsnprintf( - CPalThread *pthrCurrent, - LPSTR Buffer, - size_t Count, - LPCSTR Format, - va_list ap); - - int - InternalVfwprintf( - CPalThread *pthrCurrent, - PAL_FILE *stream, - const wchar_16 *format, - va_list ap); - } #else // __cplusplus - int - __cdecl - PAL__vsnprintf( - LPSTR Buffer, - size_t Count, - LPCSTR Format, - va_list ap); - - int - __cdecl - PAL__wvsnprintf( - LPWSTR Buffer, - size_t Count, - LPCWSTR Format, - va_list ap); - int __cdecl PAL_vfprintf( diff --git a/src/pal/src/include/pal/sharedmemory.h b/src/pal/src/include/pal/sharedmemory.h index 45cc4b2..2e0d9d2 100644 --- a/src/pal/src/include/pal/sharedmemory.h +++ b/src/pal/src/include/pal/sharedmemory.h @@ -15,30 +15,33 @@ #define _countof(a) (sizeof(a) / sizeof(a[0])) #endif // !_countof +// The temporary folder is used for storing shared memory files and their lock files. +// The location of the temporary folder varies (e.g. /data/local/tmp on Android) +// and is set in TEMP_DIRECTORY_PATH. TEMP_DIRECTORY_PATH ends with '/' // - Global shared memory files go in: -// /tmp/.dotnet/shm/global/<fileName> +// {tmp}/.dotnet/shm/global/<fileName> // - Session-scoped shared memory files go in: -// /tmp/.dotnet/shm/session<sessionId>/<fileName> +// {tmp}/.dotnet/shm/session<sessionId>/<fileName> // - Lock files associated with global shared memory files go in: -// /tmp/.dotnet/lockfiles/global/<fileName> +// {tmp}/.dotnet/lockfiles/global/<fileName> // - Lock files associated with session-scoped shared memory files go in: -// /tmp/.dotnet/lockfiles/session<sessionId>/<fileName> +// {tmp}/.dotnet/lockfiles/session<sessionId>/<fileName> #define SHARED_MEMORY_MAX_FILE_NAME_CHAR_COUNT (_MAX_FNAME - 1) #define SHARED_MEMORY_MAX_NAME_CHAR_COUNT (_countof("Global\\") - 1 + SHARED_MEMORY_MAX_FILE_NAME_CHAR_COUNT) -#define SHARED_MEMORY_TEMP_DIRECTORY_PATH "/tmp" -#define SHARED_MEMORY_RUNTIME_TEMP_DIRECTORY_PATH "/tmp/.dotnet" +#define SHARED_MEMORY_TEMP_DIRECTORY_PATH TEMP_DIRECTORY_PATH +#define SHARED_MEMORY_RUNTIME_TEMP_DIRECTORY_PATH TEMP_DIRECTORY_PATH ".dotnet" -#define SHARED_MEMORY_SHARED_MEMORY_DIRECTORY_PATH "/tmp/.dotnet/shm" -#define SHARED_MEMORY_LOCK_FILES_DIRECTORY_PATH "/tmp/.dotnet/lockfiles" +#define SHARED_MEMORY_SHARED_MEMORY_DIRECTORY_PATH TEMP_DIRECTORY_PATH ".dotnet/shm" +#define SHARED_MEMORY_LOCK_FILES_DIRECTORY_PATH TEMP_DIRECTORY_PATH ".dotnet/lockfiles" static_assert_no_msg(_countof(SHARED_MEMORY_LOCK_FILES_DIRECTORY_PATH) >= _countof(SHARED_MEMORY_SHARED_MEMORY_DIRECTORY_PATH)); #define SHARED_MEMORY_GLOBAL_DIRECTORY_NAME "global" #define SHARED_MEMORY_SESSION_DIRECTORY_NAME_PREFIX "session" static_assert_no_msg(_countof(SHARED_MEMORY_SESSION_DIRECTORY_NAME_PREFIX) >= _countof(SHARED_MEMORY_GLOBAL_DIRECTORY_NAME)); -#define SHARED_MEMORY_UNIQUE_TEMP_NAME_TEMPLATE "/tmp/.coreclr.XXXXXX" +#define SHARED_MEMORY_UNIQUE_TEMP_NAME_TEMPLATE TEMP_DIRECTORY_PATH ".coreclr.XXXXXX" #define SHARED_MEMORY_MAX_SESSION_ID_CHAR_COUNT (10) diff --git a/src/pal/src/include/pal/thread.hpp b/src/pal/src/include/pal/thread.hpp index e6dacd2..ddacfb9 100644 --- a/src/pal/src/include/pal/thread.hpp +++ b/src/pal/src/include/pal/thread.hpp @@ -94,11 +94,6 @@ namespace CorUnix ); PAL_ERROR - InitializeGlobalThreadData( - void - ); - - PAL_ERROR CreateThreadData( CPalThread **ppThread ); @@ -243,12 +238,6 @@ namespace CorUnix friend PAL_ERROR - InitializeGlobalThreadData( - void - ); - - friend - PAL_ERROR CreateThreadData( CPalThread **ppThread ); @@ -338,13 +327,6 @@ namespace CorUnix // Limit address of the stack of this thread void* m_stackLimit; - // The default stack size of a newly created thread (currently 256KB) - // when the dwStackSize paramter of PAL_CreateThread() - // is zero. This value can be set by setting the - // environment variable PAL_THREAD_DEFAULT_STACK_SIZE - // (the value should be in bytes and in hex). - static DWORD s_dwDefaultThreadStackSize; - // // The thread entry routine (called from InternalCreateThread) // diff --git a/src/pal/src/include/pal/threadsusp.hpp b/src/pal/src/include/pal/threadsusp.hpp index e1e85e2..dfd65d0 100644 --- a/src/pal/src/include/pal/threadsusp.hpp +++ b/src/pal/src/include/pal/threadsusp.hpp @@ -55,6 +55,8 @@ Abstract: #if HAVE_SYS_SEMAPHORE_H #include <sys/semaphore.h> +#elif HAVE_SEMAPHORE_H +#include <semaphore.h> #endif // HAVE_SYS_SEMAPHORE_H #elif HAS_PTHREAD_MUTEXES && HAVE_MACH_EXCEPTIONS diff --git a/src/pal/src/include/pal/utils.h b/src/pal/src/include/pal/utils.h index 3ddad4a..f381d95 100644 --- a/src/pal/src/include/pal/utils.h +++ b/src/pal/src/include/pal/utils.h @@ -20,10 +20,66 @@ Abstract: #ifndef _PAL_UTILS_H_ #define _PAL_UTILS_H_ +#include <stdint.h> + #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Alignment helpers (copied for PAL use from stdmacros.h) + +inline size_t ALIGN_UP(size_t val, size_t alignment) +{ + // alignment must be a power of 2 for this implementation to work (need modulo otherwise) + _ASSERTE(0 == (alignment & (alignment - 1))); + size_t result = (val + (alignment - 1)) & ~(alignment - 1); + _ASSERTE(result >= val); // check for overflow + return result; +} + +inline void* ALIGN_UP(void* val, size_t alignment) +{ + return (void*)ALIGN_UP((size_t)val, alignment); +} + +inline uint8_t* ALIGN_UP(uint8_t* val, size_t alignment) +{ + return (uint8_t*)ALIGN_UP((size_t)val, alignment); +} + +inline size_t ALIGN_DOWN(size_t val, size_t alignment) +{ + // alignment must be a power of 2 for this implementation to work (need modulo otherwise) + _ASSERTE(0 == (alignment & (alignment - 1))); + size_t result = val & ~(alignment - 1); + return result; +} + +inline void* ALIGN_DOWN(void* val, size_t alignment) +{ + return (void*)ALIGN_DOWN((size_t)val, alignment); +} + +inline uint8_t* ALIGN_DOWN(uint8_t* val, size_t alignment) +{ + return (uint8_t*)ALIGN_DOWN((size_t)val, alignment); +} + +inline BOOL IS_ALIGNED(size_t val, size_t alignment) +{ + // alignment must be a power of 2 for this implementation to work (need modulo otherwise) + _ASSERTE(0 == (alignment & (alignment - 1))); + return 0 == (val & (alignment - 1)); +} + +inline BOOL IS_ALIGNED(const void* val, size_t alignment) +{ + return IS_ALIGNED((size_t)val, alignment); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #ifdef __cplusplus extern "C" { diff --git a/src/pal/src/include/pal/virtual.h b/src/pal/src/include/pal/virtual.h index a4e2252..31d225f 100644 --- a/src/pal/src/include/pal/virtual.h +++ b/src/pal/src/include/pal/virtual.h @@ -58,12 +58,7 @@ enum VIRTUAL_CONSTANTS VIRTUAL_EXECUTE, VIRTUAL_EXECUTE_READ, - /* Page manipulation constants. */ -#ifdef __sparc__ - VIRTUAL_PAGE_SIZE = 0x2000, -#else // __sparc__ VIRTUAL_PAGE_SIZE = 0x1000, -#endif // __sparc__ VIRTUAL_PAGE_MASK = VIRTUAL_PAGE_SIZE - 1, BOUNDARY_64K = 0xffff }; diff --git a/src/pal/src/init/pal.cpp b/src/pal/src/init/pal.cpp index 0bda276..e6db7dc 100644 --- a/src/pal/src/init/pal.cpp +++ b/src/pal/src/init/pal.cpp @@ -18,6 +18,9 @@ Abstract: --*/ +#include "pal/dbgmsg.h" +SET_DEFAULT_DEBUG_CHANNEL(PAL); // some headers have code with asserts, so do this first + #include "pal/thread.hpp" #include "pal/synchobjects.hpp" #include "pal/procobj.hpp" @@ -27,7 +30,6 @@ Abstract: #include "../objmgr/shmobjectmanager.hpp" #include "pal/seh.hpp" #include "pal/palinternal.h" -#include "pal/dbgmsg.h" #include "pal/sharedmemory.h" #include "pal/shmemory.h" #include "pal/process.h" @@ -90,8 +92,6 @@ using namespace CorUnix; extern "C" BOOL CRTInitStdStreams( void ); -SET_DEFAULT_DEBUG_CHANNEL(PAL); - Volatile<INT> init_count = 0; Volatile<BOOL> shutdown_intent = 0; Volatile<LONG> g_coreclrInitialized = 0; @@ -314,17 +314,6 @@ Initialize( #endif // HAVE_MACH_EXCEPTIONS // - // Initialize global thread data - // - - palError = InitializeGlobalThreadData(); - if (NO_ERROR != palError) - { - ERROR("Unable to initialize thread data\n"); - goto CLEANUP1; - } - - // // Allocate the initial thread data // diff --git a/src/pal/src/loader/module.cpp b/src/pal/src/loader/module.cpp index a4fc494..63a65ff 100644 --- a/src/pal/src/loader/module.cpp +++ b/src/pal/src/loader/module.cpp @@ -18,11 +18,13 @@ Abstract: --*/ +#include "pal/dbgmsg.h" +SET_DEFAULT_DEBUG_CHANNEL(LOADER); // some headers have code with asserts, so do this first + #include "pal/thread.hpp" #include "pal/malloc.hpp" #include "pal/file.hpp" #include "pal/palinternal.h" -#include "pal/dbgmsg.h" #include "pal/module.h" #include "pal/cs.hpp" #include "pal/process.h" @@ -60,8 +62,6 @@ Abstract: using namespace CorUnix; -SET_DEFAULT_DEBUG_CHANNEL(LOADER); - // In safemath.h, Template SafeInt uses macro _ASSERTE, which need to use variable // defdbgchan defined by SET_DEFAULT_DEBUG_CHANNEL. Therefore, the include statement // should be placed after the SET_DEFAULT_DEBUG_CHANNEL(LOADER) diff --git a/src/pal/src/loader/modulename.cpp b/src/pal/src/loader/modulename.cpp index 026f89b..87c1b02 100644 --- a/src/pal/src/loader/modulename.cpp +++ b/src/pal/src/loader/modulename.cpp @@ -30,118 +30,10 @@ Abstract: #include <dlfcn.h> #endif // NEED_DLCOMPAT -#if defined(_AIX) -#include <sys/ldr.h> -#endif - using namespace CorUnix; SET_DEFAULT_DEBUG_CHANNEL(LOADER); -#if defined(_AIX) -/*++ - GetLibRotorNameViaLoadQuery - - Retrieve the full path of the librotor_pal.so using loadquery() - -Parameters: - pszBuf - CHAR array of MAX_PATH_FNAME length - -Return value: - 0 on success - -1 on failure, with last error set ---*/ -int GetLibRotorNameViaLoadQuery(LPSTR pszBuf) -{ - CHAR* pLoadQueryBuf = NULL; - UINT cbBuf = 1024; - struct ld_info * pInfo = NULL; - INT iLQRetVal = -1; - INT iRetVal = -1; - CPalThread *pThread = NULL; - - if (!pszBuf) - { - ASSERT("GetLibRotorNameViaLoadQuery requires non-NULL pszBuf\n"); - SetLastError(ERROR_INTERNAL_ERROR); - goto Done; - } - - pThread = InternalGetCurrentThread(); - // Loop trying to call loadquery with enough memory until either - // 1) we succeed, 2) we run out of memory or 3) loadquery throws - // an error other than ENOMEM - while (iLQRetVal != 0) - { - pLoadQueryBuf = (CHAR*) InternalMalloc (pThread, cbBuf * sizeof(char)); - if (!pLoadQueryBuf) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - goto Done; - } - iLQRetVal = loadquery(L_GETINFO, pLoadQueryBuf, cbBuf); - if (iLQRetVal < 0) - { - free(pThread, pLoadQueryBuf); - pLoadQueryBuf = NULL; - DWORD dwLastError = GetLastError(); - if (dwLastError == ERROR_NOT_ENOUGH_MEMORY) - { - // The buffer's too small. Try twice as large as a guess... - cbBuf *= 2; - } - else - { - SetLastError(ERROR_INTERNAL_ERROR); - goto Done; - } - } - } - - // We successfully called loadquery, so now see if we can find - // librotor_pal.a in the module list - if (pLoadQueryBuf) - { - pInfo = (struct ld_info *)pLoadQueryBuf; - while (TRUE) - { - if (strstr(pInfo->ldinfo_filename, "librotor_pal.a")) - { - UINT cchFileName = strlen(pInfo->ldinfo_filename); - if (cchFileName + 1 > MAX_PATH_FNAME) - { - ASSERT("Filename returned by loadquery was longer than MAX_PATH_FNAME!\n"); - SetLastError(ERROR_INTERNAL_ERROR); - goto Done; - } - else - { - // The buffer should be large enough to accomodate the filename. - // So, we send in the size of the filename+1 - strcpy_s(pszBuf, MAX_PATH_FNAME, pInfo->ldinfo_filename); - iRetVal = 0; - goto Done; - } - } - else - { - // The (wacky) design of ld_info is that the value of next is an offset in - // bytes rather than a pointer. So we need this weird cast to char * to get - // the pointer math correct. - if (pInfo->ldinfo_next == 0) - break; - else - pInfo = (struct ld_info *) ((char *)pInfo + pInfo->ldinfo_next); - } - } - } -Done: - if (pLoadQueryBuf) - free(pThread, pLoadQueryBuf); - return iRetVal; -} -#endif // defined(_AIX) - /*++ PAL_dladdr @@ -165,31 +57,6 @@ Notes: --*/ const char *PAL_dladdr(LPVOID ProcAddress) { -#if defined(_AIX) || defined(__hppa__) - /* dladdr is not supported on AIX or 32-bit HPUX-PARISC */ - return (NULL); -#elif defined(_HPUX_) && defined(_IA64_) - /* dladdr is not supported on HP-UX/IA64. That said, PAL_dladdr just returns to module name - and we can get that via dlgetname. So use that for HPUX. */ - { - char* pszName = NULL; - load_module_desc desc; - __uint64_t uimodret = NULL; - uimodret = dlmodinfo((__uint64_t)ProcAddress, &desc, sizeof(desc), NULL, 0, 0); - if (!uimodret) - { - WARN("dlmodinfo call failed! dlerror says '%s'\n", dlerror()); - return NULL; - } - pszName = dlgetname(&desc, sizeof(desc), NULL, 0, 0); - if (!pszName) - { - WARN("dlgetname desc didn't describe a loaded module?! dlerror says '%s'\n", dlerror()); - return NULL; - } - return pszName; - } -#else Dl_info dl_info; if (!dladdr(ProcAddress, &dl_info)) { @@ -202,6 +69,5 @@ const char *PAL_dladdr(LPVOID ProcAddress) /* Return the module name */ return dl_info.dli_fname; } -#endif } diff --git a/src/pal/src/misc/dbgmsg.cpp b/src/pal/src/misc/dbgmsg.cpp index 488e614..d6f173f 100644 --- a/src/pal/src/misc/dbgmsg.cpp +++ b/src/pal/src/misc/dbgmsg.cpp @@ -528,8 +528,8 @@ int DBG_printf_gcc(DBG_CHANNEL_ID channel, DBG_LEVEL_ID level, BOOL bHeader, va_start(args, format); - output_size+=Silent_PAL_vsnprintf(buffer_ptr, DBG_BUFFER_SIZE-output_size, - format, args); + output_size+=_vsnprintf_s(buffer_ptr, DBG_BUFFER_SIZE-output_size, _TRUNCATE, + format, args); va_end(args); if( output_size > DBG_BUFFER_SIZE ) @@ -633,8 +633,8 @@ int DBG_printf_c99(DBG_CHANNEL_ID channel, DBG_LEVEL_ID level, BOOL bHeader, } va_start(args, format); - output_size+=Silent_PAL_vsnprintf(buffer_ptr, DBG_BUFFER_SIZE-output_size, - format, args); + output_size+=_vsnprintf_s(buffer_ptr, DBG_BUFFER_SIZE-output_size, _TRUNCATE, + format, args); va_end(args); if(output_size>DBG_BUFFER_SIZE) @@ -960,7 +960,7 @@ void PAL_DisplayDialogFormatted(const char *szTitle, const char *szTextFormat, . const int cchBuffer = 4096; char *szBuffer = (char*)alloca(cchBuffer); - PAL__vsnprintf(szBuffer, cchBuffer, szTextFormat, args); + _vsnprintf_s(szBuffer, cchBuffer, _TRUNCATE, szTextFormat, args); PAL_DisplayDialog(szTitle, szBuffer); va_end(args); diff --git a/src/pal/src/misc/fmtmessage.cpp b/src/pal/src/misc/fmtmessage.cpp index 46e0af6..70b854a 100644 --- a/src/pal/src/misc/fmtmessage.cpp +++ b/src/pal/src/misc/fmtmessage.cpp @@ -205,7 +205,7 @@ static LPWSTR FMTMSG_ProcessPrintf( wchar_t c , UINT nFormatLength = 0; int nBufferLength = 0; - TRACE( "FMTMSG_ProcessPrintf( %C, %S, %S )\n", c, + TRACE( "FMTMSG_ProcessPrintf( %C, %S, %p )\n", c, lpPrintfString, lpInsertString ); switch ( c ) @@ -299,7 +299,6 @@ FormatMessageW( LPWSTR lpReturnString = NULL; LPWSTR lpWorkingString = NULL; - PERF_ENTRY(FormatMessageW); ENTRY( "FormatMessageW(dwFlags=%#x, lpSource=%p, dwMessageId=%#x, " "dwLanguageId=%#x, lpBuffer=%p, nSize=%u, va_list=%p)\n", diff --git a/src/pal/src/misc/perftrace.cpp b/src/pal/src/misc/perftrace.cpp index d4fba33..fdefdf6 100644 --- a/src/pal/src/misc/perftrace.cpp +++ b/src/pal/src/misc/perftrace.cpp @@ -23,26 +23,6 @@ Abstract: #ifdef PAL_PERF -#ifndef PLATFORM_UNIX -/* PAL Headers */ -#include "perftrace.h" - -/* Standard Headers */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> - -#define snprintf _snprintf -#define MiscGetenv getenv -#define pthread_getspecific TlsGetValue -#define THREADSilentGetCurrentThreadId GetCurrentThreadId -#define getpid GetCurrentProcessId -#define PAL_fgets fgets // on Windows, we want fgets. -#define PAL_fwrite fwrite // on Windows, we want fwrite. -#define PAL_fseek fseek // on Windows, we want fseek. - -#else /* PAL Headers */ #include "pal/palinternal.h" #include "pal/perftrace.h" @@ -60,7 +40,6 @@ Abstract: #include <unistd.h> SET_DEFAULT_DEBUG_CHANNEL(MISC); -#endif //End of PLATFORM_UNIX #define PAL_PERF_MAX_LOGLINE 0x400 /* 1K */ @@ -110,21 +89,12 @@ typedef struct _pal_perf_program_info ULONGLONG total_duration; /* Total CPU clock ticks of all the threads */ ULONGLONG pal_duration; /* Total CPU clock ticks spent inside PAL */ -#ifndef PLATFORM_UNIX - DWORD process_id; -#else pid_t process_id; -#endif char start_time[32]; /* must be at least 26 characters */ } pal_perf_program_info; -#ifndef PLATFORM_UNIX -typedef FILE PERF_FILE; -#define PERF_FILEFN(x) x -#else typedef PAL_FILE PERF_FILE; #define PERF_FILEFN(x) PAL_ ## x -#endif static ULONGLONG PERFGetTicks(); static double PERFComputeStandardDeviation(pal_perf_api_info *api); @@ -144,11 +114,7 @@ typedef char PAL_API_NAME[PAL_PERF_MAX_FUNCTION_NAME]; static PAL_API_NAME API_list[PAL_API_NUMBER] ; static pal_perf_program_info program_info; -#ifndef PLATFORM_UNIX -static DWORD PERF_tlsTableKey=0 ; -#else static pthread_key_t PERF_tlsTableKey=0 ; -#endif static pal_thread_list_node * process_pal_thread_list=NULL; static BOOL pal_profile_on=FALSE; @@ -199,19 +165,11 @@ static const char PAL_PERF_HISTOGRAM_SIZE[]="PAL_PERF_HISTOGRAM_SIZE"; static const char PAL_PERF_HISTOGRAM_STEP[]="PAL_PERF_HISTOGRAM_STEP"; static const char traced_apis_filename[]="PerfTracedAPIs.txt"; static const char perf_enabled_filename[]="AllPerfEnabledAPIs.txt"; -#ifndef PLATFORM_UNIX -static const char PATH_SEPARATOR[] = "\\"; -#else static const char PATH_SEPARATOR[] = "/"; -#endif -#ifndef PLATFORM_UNIX -#define LLFORMAT "%I64u" -#else #define LLFORMAT "%llu" -#endif static ULONGLONG @@ -231,11 +189,7 @@ PERFGetTicks(){ #endif return ((ULONGLONG)((unsigned int)(d)) << 32) | (unsigned int)(a); #else -#ifdef __sparc__ - return (ULONGLONG)gethrtime(); -#else return 0; // on non-BSD and non-Windows, we'll return 0 for now. -#endif // __sparc__ #endif // _X86_ } @@ -283,11 +237,7 @@ BOOL PERFInitProgramInfo(LPWSTR command_line, LPWSTR exe_path) { ULONGLONG start_tick; -#ifndef PLATFORM_UNIX - time_t tv; -#else struct timeval tv; -#endif if (WideCharToMultiByte(CP_ACP, 0, command_line, -1, program_info.command_line, PAL_PERF_MAX_LOGLINE-1, NULL, NULL) == 0) @@ -299,23 +249,14 @@ PERFInitProgramInfo(LPWSTR command_line, LPWSTR exe_path) gethostname(program_info.hostname, PAL_PERF_MAX_FUNCTION_NAME); program_info.process_id = getpid(); -#ifndef PLATFORM_UNIX - time( &tv ); - strcpy(program_info.start_time, ctime( &tv )); -#else gettimeofday(&tv, NULL); ctime_r(&tv.tv_sec, program_info.start_time); -#endif // estimate the cpu clock cycles start_tick = PERFGetTicks(); if (start_tick != 0) { -#ifndef PLATFORM_UNIX - Sleep(1000); //Sleep on Windows takes milliseconds as argument -#else sleep(1); -#endif program_info.cpu_clock_frequency = (double) (PERFGetTicks() - start_tick); } else @@ -379,13 +320,8 @@ PERFInitialize(LPWSTR command_line, LPWSTR exe_path) pal_profile_on = FALSE; // turn it off until we setup everything. // allocate the TLS index for structures -#ifndef PLATFORM_UNIX - if( ( PERF_tlsTableKey = TlsAlloc() ) == -1 ) - ret = FALSE; -#else if( pthread_key_create(&PERF_tlsTableKey , NULL) != 0 ) ret = FALSE; -#endif if( ret == TRUE ) { @@ -399,11 +335,7 @@ PERFInitialize(LPWSTR command_line, LPWSTR exe_path) else { -#ifndef PLATFORM_UNIX - TlsFree(PERF_tlsTableKey ); -#else pthread_key_delete(PERF_tlsTableKey ); -#endif ret = FALSE; } } @@ -426,11 +358,7 @@ void PERFTerminate( ) return; PERFlushAllLogs(); -#ifndef PLATFORM_UNIX - TlsFree(PERF_tlsTableKey ); -#else - pthread_key_delete(PERF_tlsTableKey ); -#endif + pthread_key_delete(PERF_tlsTableKey ); PAL_free(pal_function_map); } @@ -516,13 +444,8 @@ BOOL PERFAllocThreadInfo( ) local_info->start_ticks = 0; memset(log_buf, 0, PAL_PERF_PROFILE_BUFFER_SIZE); -#ifndef PLATFORM_UNIX - if ( TlsSetValue(PERF_tlsTableKey, local_info) == 0) - ret = FALSE; -#else if (pthread_setspecific(PERF_tlsTableKey, local_info) != 0) ret = FALSE; -#endif PERFAllocThreadInfoExit: if (ret == TRUE) @@ -799,11 +722,7 @@ PERFReadSetting( ) char * pal_perf_histogram_size_env; char * pal_perf_histogram_step_env; -#ifdef PLATFORM_UNIX PAL_FILE * hFile; -#else - FILE * hFile; -#endif if((pal_function_map == NULL) || (PAL_API_NUMBER < 0) ) { @@ -936,11 +855,7 @@ PERFReadSetting( ) if(input_file_name) { -#ifdef PLATFORM_UNIX hFile = PAL_fopen(input_file_name, "r+"); -#else - hFile = fopen(input_file_name, "r+"); -#endif if ( hFile == NULL ) { memset(pal_function_map, 1, PAL_API_NUMBER); @@ -979,11 +894,7 @@ PERFReadSetting( ) } -#ifdef PLATFORM_UNIX PAL_fclose(hFile); -#else - fclose(hFile); -#endif ret = TRUE; } } @@ -1031,11 +942,7 @@ PERFReadSetting( ) return ret; } -#ifdef PLATFORM_UNIX hFile = PAL_fopen(input_file_name, "r+"); -#else - hFile = fopen(input_file_name, "r+"); -#endif if ( hFile != NULL ) { @@ -1065,11 +972,7 @@ PERFReadSetting( ) } } -#ifdef PLATFORM_UNIX PAL_fclose(hFile); -#else - fclose(hFile); -#endif } return ret; @@ -1126,13 +1029,7 @@ PERFLogFunctionEntry(unsigned int pal_api_id, ULONGLONG *pal_perf_start_tick ) short bufused = 0; -#ifndef PLATFORM_UNIX - DWORD tv; - DWORD last_error; - last_error = GetLastError(); -#else struct timeval tv; -#endif if(!pal_perf_enabled || pal_function_map==NULL || !pal_profile_on ) // haven't initialize, just quit. @@ -1163,28 +1060,17 @@ PERFLogFunctionEntry(unsigned int pal_api_id, ULONGLONG *pal_perf_start_tick ) PERFFlushLog(local_info, FALSE); } -#ifndef PLATFORM_UNIX - tv = GetTickCount(); -#else gettimeofday(&tv, NULL); -#endif buf_off = local_info->buf_offset; -#ifndef PLATFORM_UNIX - bufused = snprintf(&write_buf[buf_off], PAL_PERF_MAX_LOGLINE, "----> %d %lu entry.\n", pal_api_id, tv ); -#else bufused = snprintf(&write_buf[buf_off], PAL_PERF_MAX_LOGLINE, "----> %d %lu %06u entry.\n", pal_api_id, tv.tv_sec, tv.tv_usec ); -#endif local_info->buf_offset += bufused; } if(nested_tracing) local_info->profile_enabled = TRUE; *pal_perf_start_tick = PERFGetTicks(); } -#ifndef PLATFORM_UNIX - SetLastError( last_error ); -#endif return; } @@ -1223,14 +1109,8 @@ PERFLogFunctionExit(unsigned int pal_api_id, ULONGLONG *pal_perf_start_tick ) short bufused = 0; DWORD off; ULONGLONG duration = 0; -#ifndef PLATFORM_UNIX - DWORD timev; - DWORD last_error; - last_error = GetLastError(); -#else struct timeval timev; -#endif if(!pal_perf_enabled || (pal_function_map == NULL) || !pal_profile_on ) // haven't initiallize yet, just quit. return; @@ -1257,17 +1137,10 @@ PERFLogFunctionExit(unsigned int pal_api_id, ULONGLONG *pal_perf_start_tick ) if(summary_only) { local_info->profile_enabled = TRUE; -#ifndef PLATFORM_UNIX - SetLastError( last_error ); -#endif return; } -#ifndef PLATFORM_UNIX - timev = GetTickCount(); -#else gettimeofday(&timev, NULL); -#endif buf = local_info->pal_write_buf; if(local_info->buf_offset >= PAL_PERF_BUFFER_FULL) @@ -1276,17 +1149,10 @@ PERFLogFunctionExit(unsigned int pal_api_id, ULONGLONG *pal_perf_start_tick ) } off = local_info->buf_offset; -#ifndef PLATFORM_UNIX - bufused = snprintf(&buf[off], PAL_PERF_MAX_LOGLINE, "<---- %d %lu exit. \n", pal_api_id, timev); -#else bufused = snprintf(&buf[off], PAL_PERF_MAX_LOGLINE, "<---- %d %lu %06u exit. \n", pal_api_id, timev.tv_sec, timev.tv_usec ); -#endif local_info->buf_offset += bufused; local_info->profile_enabled = TRUE; } -#ifndef PLATFORM_UNIX - SetLastError( last_error ); -#endif return; } @@ -1295,10 +1161,6 @@ PERFNoLatencyProfileEntry(unsigned int pal_api_id ) { pal_perf_thread_info * local_info=NULL; pal_perf_api_info * table; -#ifndef PLATFORM_UNIX - DWORD last_error; - last_error = GetLastError(); -#endif if(!pal_perf_enabled || pal_function_map==NULL || !pal_profile_on ) // haven't initialize, just quit. return; @@ -1307,9 +1169,6 @@ PERFNoLatencyProfileEntry(unsigned int pal_api_id ) local_info= (pal_perf_thread_info * )pthread_getspecific(PERF_tlsTableKey); if (local_info==NULL ) { -#ifndef PLATFORM_UNIX - SetLastError( last_error ); -#endif return; } else{ @@ -1317,9 +1176,6 @@ PERFNoLatencyProfileEntry(unsigned int pal_api_id ) table[pal_api_id].entries++; } } -#ifndef PLATFORM_UNIX - SetLastError( last_error ); -#endif return; } @@ -1328,10 +1184,6 @@ void PERFEnableThreadProfile(BOOL isInternal) { pal_perf_thread_info * local_info; -#ifndef PLATFORM_UNIX - DWORD last_error; - last_error = GetLastError(); -#endif if (!pal_perf_enabled) return; if (NULL != (local_info = (pal_perf_thread_info*)pthread_getspecific(PERF_tlsTableKey))) @@ -1341,9 +1193,6 @@ PERFEnableThreadProfile(BOOL isInternal) local_info->start_ticks = PERFGetTicks(); } } -#ifndef PLATFORM_UNIX - SetLastError( last_error ); -#endif } @@ -1351,10 +1200,6 @@ void PERFDisableThreadProfile(BOOL isInternal) { pal_perf_thread_info * local_info; -#ifndef PLATFORM_UNIX - DWORD last_error; - last_error = GetLastError(); -#endif if (!pal_perf_enabled) return; if (NULL != (local_info = (pal_perf_thread_info*)pthread_getspecific(PERF_tlsTableKey))) @@ -1364,9 +1209,6 @@ PERFDisableThreadProfile(BOOL isInternal) local_info->total_duration = PERFGetTicks() - local_info->start_ticks; } } -#ifndef PLATFORM_UNIX - SetLastError( last_error ); -#endif } @@ -1406,29 +1248,17 @@ static char * PERFIsValidPath( const char * path ) { -#ifndef PLATFORM_UNIX - DWORD result; -#else DIR * dir; -#endif if(( path==NULL) || (strlen(path)==0)) return NULL; -#ifndef PLATFORM_UNIX - result = GetFileAttributesA( path ); - if ((result != INVALID_FILE_ATTRIBUTES) && (result & FILE_ATTRIBUTE_DIRECTORY)) - { - return ((char *) path ); - } -#else dir = opendir(path); if( dir!=NULL) { closedir(dir); return ((char *)path); } -#endif return NULL; } @@ -1508,13 +1338,6 @@ PAL_GetCpuTickCount(VOID) return PERFGetTicks(); } -#ifndef PLATFORM_UNIX -#undef snprintf -#undef MiscGetenv -#undef pthread_key_t -#undef pthread_getspecific -#endif /* ifndef PLATFORM_UNIX definitions */ - #endif /* PAL_PERF */ diff --git a/src/pal/src/misc/sysinfo.cpp b/src/pal/src/misc/sysinfo.cpp index e7589e8..3ccb35a 100644 --- a/src/pal/src/misc/sysinfo.cpp +++ b/src/pal/src/misc/sysinfo.cpp @@ -76,11 +76,6 @@ Revision History: SET_DEFAULT_DEBUG_CHANNEL(MISC); -#if defined(_HPUX_) && ( defined (_IA64_) || defined (__hppa__) ) -#include <sys/pstat.h> -#include <sys/vmparam.h> -#endif - #ifndef __APPLE__ #if HAVE_SYSCONF && HAVE__SC_AVPHYS_PAGES #define SYSCONF_PAGES _SC_AVPHYS_PAGES @@ -135,22 +130,11 @@ GetSystemInfo( lpSystemInfo->dwActiveProcessorMask_PAL_Undefined = 0; #if HAVE_SYSCONF -#if defined(_HPUX_) && ( defined (_IA64_) || defined (__hppa__) ) - struct pst_dynamic psd; - if (pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0) != -1) { - nrcpus = psd.psd_proc_cnt; - } - else { - ASSERT("pstat_getdynamic failed (%d)\n", errno); - } - -#else // !__hppa__ nrcpus = sysconf(_SC_NPROCESSORS_ONLN); if (nrcpus < 1) { ASSERT("sysconf failed for _SC_NPROCESSORS_ONLN (%d)\n", errno); } -#endif // __hppa__ #elif HAVE_SYSCTL int rc; size_t sz; @@ -171,7 +155,7 @@ GetSystemInfo( #ifdef VM_MAXUSER_ADDRESS lpSystemInfo->lpMaximumApplicationAddress = (PVOID) VM_MAXUSER_ADDRESS; -#elif defined(__sun__) || defined(_AIX) || defined(__hppa__) || ( defined (_IA64_) && defined (_HPUX_) ) || defined(__linux__) +#elif defined(__linux__) lpSystemInfo->lpMaximumApplicationAddress = (PVOID) (1ull << 47); #elif defined(USERLIMIT) lpSystemInfo->lpMaximumApplicationAddress = (PVOID) USERLIMIT; diff --git a/src/pal/src/misc/utils.cpp b/src/pal/src/misc/utils.cpp index 1e333d1..f0ff634 100644 --- a/src/pal/src/misc/utils.cpp +++ b/src/pal/src/misc/utils.cpp @@ -18,21 +18,21 @@ Abstract: --*/ +#include "pal/dbgmsg.h" +SET_DEFAULT_DEBUG_CHANNEL(MISC); // some headers have code with asserts, so do this first + #include "pal/palinternal.h" #if HAVE_VM_ALLOCATE #include <mach/message.h> #endif //HAVE_VM_ALLOCATE #include "pal/utils.h" -#include "pal/dbgmsg.h" #include "pal/file.h" #include <errno.h> #include <string.h> -SET_DEFAULT_DEBUG_CHANNEL(MISC); - // In safemath.h, Template SafeInt uses macro _ASSERTE, which need to use variable // defdbgchan defined by SET_DEFAULT_DEBUG_CHANNEL. Therefore, the include statement // should be placed after the SET_DEFAULT_DEBUG_CHANNEL(MISC) diff --git a/src/pal/src/safecrt/cruntime.h b/src/pal/src/safecrt/cruntime.h index cdad474..7341a38 100644 --- a/src/pal/src/safecrt/cruntime.h +++ b/src/pal/src/safecrt/cruntime.h @@ -36,11 +36,11 @@ #endif /* defined (_SYSCRT) && defined (_WIN64) */ #if !defined (UNALIGNED) -#if defined (_M_IA64) || defined (_M_AMD64) +#if defined (_M_AMD64) #define UNALIGNED __unaligned -#else /* defined (_M_IA64) || defined (_M_AMD64) */ +#else /* defined (_M_AMD64) */ #define UNALIGNED -#endif /* defined (_M_IA64) || defined (_M_AMD64) */ +#endif /* defined (_M_AMD64) */ #endif /* !defined (UNALIGNED) */ #ifdef _M_IX86 @@ -57,9 +57,9 @@ #define REG8 #define REG9 -#elif defined (_M_IA64) || defined (_M_AMD64) +#elif defined (_M_AMD64) /* - * IA64 + * AMD64 */ #define REG1 register #define REG2 register @@ -71,7 +71,7 @@ #define REG8 register #define REG9 register -#else /* defined (_M_IA64) || defined (_M_AMD64) */ +#else /* defined (_M_AMD64) */ #pragma message ("Machine register set not defined") @@ -89,7 +89,7 @@ #define REG8 #define REG9 -#endif /* defined (_M_IA64) || defined (_M_AMD64) */ +#endif /* defined (_M_AMD64) */ /* * Are the macro definitions below still needed in this file? diff --git a/src/pal/src/safecrt/sscanf_s.cpp b/src/pal/src/safecrt/sscanf_s.cpp index 4f548bc..7a481b5 100644 --- a/src/pal/src/safecrt/sscanf_s.cpp +++ b/src/pal/src/safecrt/sscanf_s.cpp @@ -21,7 +21,7 @@ typedef int (*INPUTFN)(miniFILE *, const unsigned char*, va_list); typedef int (*WINPUTFN)(miniFILE *, const wchar_t*, va_list); - +extern size_t PAL_wcsnlen(const WCHAR* inString, size_t inMaxSize); /*** *static int v[nw]scan_fn([w]inputfn, string, [count], format, ...) @@ -115,7 +115,7 @@ static int __cdecl vwscan_fn ( miniFILE str; miniFILE *infile = &str; int retval; - size_t count = wcsnlen(string, INT_MAX); + size_t count = PAL_wcsnlen(string, INT_MAX); _VALIDATE_RETURN( (string != NULL), EINVAL, EOF); _VALIDATE_RETURN( (format != NULL), EINVAL, EOF); @@ -149,7 +149,7 @@ static int __cdecl vnwscan_fn ( miniFILE str; miniFILE *infile = &str; int retval; - size_t length = wcsnlen(string, INT_MAX); + size_t length = PAL_wcsnlen(string, INT_MAX); _VALIDATE_RETURN( (string != NULL), EINVAL, EOF); _VALIDATE_RETURN( (format != NULL), EINVAL, EOF); diff --git a/src/pal/src/safecrt/wcslen_s.cpp b/src/pal/src/safecrt/wcslen_s.cpp index 4fd5371..0688148 100644 --- a/src/pal/src/safecrt/wcslen_s.cpp +++ b/src/pal/src/safecrt/wcslen_s.cpp @@ -42,7 +42,7 @@ * *******************************************************************************/ -size_t __cdecl wcsnlen(const wchar_t *wcs, size_t maxsize) +size_t __cdecl PAL_wcsnlen(const wchar_t *wcs, size_t maxsize) { size_t n; diff --git a/src/pal/src/shmemory/shmemory.cpp b/src/pal/src/shmemory/shmemory.cpp index 42e06be..35dadd6 100644 --- a/src/pal/src/shmemory/shmemory.cpp +++ b/src/pal/src/shmemory/shmemory.cpp @@ -189,10 +189,6 @@ SET_DEFAULT_DEBUG_CHANNEL(SHMEM); #define SEGMENT_NAME_SUFFIX_LENGTH 10 -#if defined(_DEBUG) && defined(_HPUX_) -#define TRACK_SHMLOCK_OWNERSHIP -#endif // _DEBUG && _HPUX_ - /* SHMPTR structure : High byte is SHM segment number @@ -808,24 +804,6 @@ int SHMLock(void) CHECK_CANARIES(header); #endif // TRACK_SHMLOCK_OWNERSHIP -#ifdef _HPUX_ - // - // TODO: workaround for VSW # 381564 - // - if (0 == tmp_pid && my_pid != header->spinlock) - { - ERROR("InterlockedCompareExchange returned the Comperand but " - "failed to store the Exchange value to the Destination: " - "looping again [my_pid=%u header->spinlock=%u tmp_pid=%u " - "spincount=%d locking_thread=%u]\n", (DWORD)my_pid, - (DWORD)header->spinlock, (DWORD)tmp_pid, (int)spincount, - (HANDLE)locking_thread); - - // Keep looping - tmp_pid = 42; - } -#endif // _HPUX_ - if (0 == tmp_pid) { // Spinlock acquired: break out of the loop @@ -964,31 +942,17 @@ int SHMRelease(void) #endif // TRACK_SHMLOCK_OWNERSHIP -#ifdef _HPUX_ - // - // TODO: workaround for VSW # 381564 - // - do -#endif // _HPUX_ - { - /* Make sure we don't touch the spinlock if we don't own it. We're - supposed to own it if we get here, but just in case... */ - tmp_pid = InterlockedCompareExchange((LONG *) &header->spinlock, 0, my_pid); + /* Make sure we don't touch the spinlock if we don't own it. We're + supposed to own it if we get here, but just in case... */ + tmp_pid = InterlockedCompareExchange((LONG *) &header->spinlock, 0, my_pid); - if (tmp_pid != my_pid) - { - ASSERT("Process 0x%08x tried to release spinlock owned by process " - "0x%08x! \n", my_pid, tmp_pid); - PALCLeaveCriticalSection(&shm_critsec); - return 0; - } + if (tmp_pid != my_pid) + { + ASSERT("Process 0x%08x tried to release spinlock owned by process " + "0x%08x! \n", my_pid, tmp_pid); + PALCLeaveCriticalSection(&shm_critsec); + return 0; } -#ifdef _HPUX_ - // - // TODO: workaround for VSW # 381564 - // - while (my_pid == header->spinlock); -#endif // _HPUX_ /* indicate no thread (in this process) holds the SHM lock */ locking_thread = 0; diff --git a/src/pal/src/thread/process.cpp b/src/pal/src/thread/process.cpp index a64bfb8..ae069ae 100644 --- a/src/pal/src/thread/process.cpp +++ b/src/pal/src/thread/process.cpp @@ -18,6 +18,9 @@ Abstract: --*/ +#include "pal/dbgmsg.h" +SET_DEFAULT_DEBUG_CHANNEL(PROCESS); // some headers have code with asserts, so do this first + #include "pal/procobj.hpp" #include "pal/thread.hpp" #include "pal/file.hpp" @@ -29,7 +32,6 @@ Abstract: #include "pal/init.h" #include "pal/critsect.h" #include "pal/debug.h" -#include "pal/dbgmsg.h" #include "pal/utils.h" #include "pal/environ.h" #include "pal/virtual.h" @@ -67,8 +69,6 @@ Abstract: using namespace CorUnix; -SET_DEFAULT_DEBUG_CHANNEL(PROCESS); - CObjectType CorUnix::otProcess( otiProcess, NULL, @@ -1453,7 +1453,7 @@ static uint64_t HashSemaphoreName(uint64_t a, uint64_t b) #define HashSemaphoreName(a,b) a,b #endif -static const char* PipeNameFormat = "/tmp/clr-debug-pipe-%d-%llu-%s"; +static const char* PipeNameFormat = TEMP_DIRECTORY_PATH "clr-debug-pipe-%d-%llu-%s"; class PAL_RuntimeStartupHelper { @@ -1879,7 +1879,7 @@ Parameters: None Return value: - TRUE - succeeded, FALSE - failed + TRUE - successfully launched by debugger, FALSE - not launched or some failure in the handshake --*/ BOOL PALAPI @@ -1889,7 +1889,7 @@ PAL_NotifyRuntimeStarted() char continueSemName[CLR_SEM_MAX_NAMELEN]; sem_t *startupSem = SEM_FAILED; sem_t *continueSem = SEM_FAILED; - BOOL result = TRUE; + BOOL launched = FALSE; UINT64 processIdDisambiguationKey = 0; GetProcessIdDisambiguationKey(gPID, &processIdDisambiguationKey); @@ -1899,9 +1899,7 @@ PAL_NotifyRuntimeStarted() TRACE("PAL_NotifyRuntimeStarted opening continue '%s' startup '%s'\n", continueSemName, startupSemName); - - // Open the debugger startup semaphore. If it doesn't exists, then we do nothing and - // the function is successful. + // Open the debugger startup semaphore. If it doesn't exists, then we do nothing and return startupSem = sem_open(startupSemName, 0); if (startupSem == SEM_FAILED) { @@ -1913,7 +1911,6 @@ PAL_NotifyRuntimeStarted() if (continueSem == SEM_FAILED) { ASSERT("sem_open(%s) failed: %d (%s)\n", continueSemName, errno, strerror(errno)); - result = FALSE; goto exit; } @@ -1921,7 +1918,6 @@ PAL_NotifyRuntimeStarted() if (sem_post(startupSem) != 0) { ASSERT("sem_post(startupSem) failed: errno is %d (%s)\n", errno, strerror(errno)); - result = FALSE; goto exit; } @@ -1929,10 +1925,12 @@ PAL_NotifyRuntimeStarted() if (sem_wait(continueSem) != 0) { ASSERT("sem_wait(continueSem) failed: errno is %d (%s)\n", errno, strerror(errno)); - result = FALSE; goto exit; } + // Returns that the runtime was successfully launched for debugging + launched = TRUE; + exit: if (startupSem != SEM_FAILED) { @@ -1942,7 +1940,7 @@ exit: { sem_close(continueSem); } - return result; + return launched; } /*++ diff --git a/src/pal/src/thread/thread.cpp b/src/pal/src/thread/thread.cpp index 566ef85..5328332 100644 --- a/src/pal/src/thread/thread.cpp +++ b/src/pal/src/thread/thread.cpp @@ -34,6 +34,8 @@ SET_DEFAULT_DEBUG_CHANNEL(THREAD); // some headers have code with asserts, so do #include "pal/module.h" #include "pal/environ.h" #include "pal/init.h" +#include "pal/utils.h" +#include "pal/virtual.h" #if defined(__NetBSD__) && !HAVE_PTHREAD_GETCPUCLOCKID #include <sys/cdefs.h> @@ -77,13 +79,6 @@ using namespace CorUnix; /* ------------------- Definitions ------------------------------*/ -// The default stack size of a newly created thread (currently 256KB) -// when the dwStackSize parameter of PAL_CreateThread() -// is zero. This value can be set by setting the -// environment variable PAL_THREAD_DEFAULT_STACK_SIZE -// (the value should be in bytes and in hex). -DWORD CPalThread::s_dwDefaultThreadStackSize = 256*1024; - /* list of free CPalThread objects */ static Volatile<CPalThread*> free_threads_list = NULL; @@ -528,6 +523,7 @@ CorUnix::InternalCreateThread( #endif // PTHREAD_CREATE_MODIFIES_ERRNO BOOL fHoldingProcessLock = FALSE; int iError = 0; + size_t alignedStackSize; if (0 != terminator) { @@ -573,7 +569,24 @@ CorUnix::InternalCreateThread( palError = ERROR_INVALID_PARAMETER; goto EXIT; } - + + alignedStackSize = dwStackSize; + if (alignedStackSize != 0) + { + // Some systems require the stack size to be aligned to the page size + if (sizeof(alignedStackSize) <= sizeof(dwStackSize) && alignedStackSize + (VIRTUAL_PAGE_SIZE - 1) < alignedStackSize) + { + // When coming here from the public API surface, the incoming value is originally a nonnegative signed int32, so + // this shouldn't happen + ASSERT( + "Couldn't align the requested stack size (%Iu) to the page size because the stack size was too large\n", + alignedStackSize); + palError = ERROR_INVALID_PARAMETER; + goto EXIT; + } + alignedStackSize = ALIGN_UP(alignedStackSize, VIRTUAL_PAGE_SIZE); + } + // Ignore the STACK_SIZE_PARAM_IS_A_RESERVATION flag dwCreationFlags &= ~STACK_SIZE_PARAM_IS_A_RESERVATION; @@ -616,42 +629,34 @@ CorUnix::InternalCreateThread( fAttributesInitialized = TRUE; /* adjust the stack size if necessary */ - if (0 != pthread_attr_getstacksize(&pthreadAttr, &pthreadStackSize)) + if (alignedStackSize != 0) { - ERROR("couldn't set thread stack size\n"); - palError = ERROR_INTERNAL_ERROR; - goto EXIT; - } - - TRACE("default pthread stack size is %d, caller requested %d (default is %d)\n", - pthreadStackSize, dwStackSize, CPalThread::s_dwDefaultThreadStackSize); - - if (0 == dwStackSize) - { - dwStackSize = CPalThread::s_dwDefaultThreadStackSize; - } - #ifdef PTHREAD_STACK_MIN - if (PTHREAD_STACK_MIN > pthreadStackSize) - { - WARN("default stack size is reported as %d, but PTHREAD_STACK_MIN is " - "%d\n", pthreadStackSize, PTHREAD_STACK_MIN); - } -#endif - - if (pthreadStackSize < dwStackSize) - { - TRACE("setting thread stack size to %d\n", dwStackSize); - if (0 != pthread_attr_setstacksize(&pthreadAttr, dwStackSize)) + const size_t MinStackSize = PTHREAD_STACK_MIN; +#else // !PTHREAD_STACK_MIN + const size_t MinStackSize = 64 * 1024; // this value is typically accepted by pthread_attr_setstacksize() +#endif // PTHREAD_STACK_MIN + _ASSERTE(IS_ALIGNED(MinStackSize, VIRTUAL_PAGE_SIZE)); + if (alignedStackSize < MinStackSize) { - ERROR("couldn't set pthread stack size to %d\n", dwStackSize); + // Adjust the stack size to a minimum value that is likely to be accepted by pthread_attr_setstacksize(). If this + // function fails, typically the caller will end up throwing OutOfMemoryException under the assumption that the + // requested stack size is too large or the system does not have sufficient memory to create a thread. Try to + // prevent failing just just because the stack size value is too low. + alignedStackSize = MinStackSize; + } + + TRACE("setting thread stack size to %Iu\n", alignedStackSize); + if (0 != pthread_attr_setstacksize(&pthreadAttr, alignedStackSize)) + { + ERROR("couldn't set pthread stack size to %Iu\n", alignedStackSize); palError = ERROR_INTERNAL_ERROR; goto EXIT; } } else { - TRACE("using the system default thread stack size of %d\n", pthreadStackSize); + TRACE("using the system default thread stack size\n"); } #if HAVE_THREAD_SELF || HAVE__LWP_SELF @@ -1755,39 +1760,6 @@ fail: return NULL; } - -#define PAL_THREAD_DEFAULT_STACK_SIZE "PAL_THREAD_DEFAULT_STACK_SIZE" - -PAL_ERROR -CorUnix::InitializeGlobalThreadData( - void - ) -{ - PAL_ERROR palError = NO_ERROR; - char *pszStackSize = NULL; - - // - // Read in the environment to see whether we need to change the default - // thread stack size. - // - pszStackSize = EnvironGetenv(PAL_THREAD_DEFAULT_STACK_SIZE); - if (NULL != pszStackSize) - { - // Environment variable exists - char *pszEnd; - DWORD dw = PAL_strtoul(pszStackSize, &pszEnd, 16); // treat it as hex - if ( (pszStackSize != pszEnd) && (0 != dw) ) - { - CPalThread::s_dwDefaultThreadStackSize = dw; - } - - free(pszStackSize); - } - - return palError; -} - - /*++ Function: CreateThreadData diff --git a/src/pal/src/thread/threadsusp.cpp b/src/pal/src/thread/threadsusp.cpp index b31b88d..c7787be 100644 --- a/src/pal/src/thread/threadsusp.cpp +++ b/src/pal/src/thread/threadsusp.cpp @@ -36,16 +36,6 @@ Revision History: #include <limits.h> #include <debugmacrosext.h> -#if defined(_AIX) -// AIX requires explicit definition of the union semun (see semctl man page) -union semun -{ - int val; - struct semid_ds * buf; - unsigned short * array; -}; -#endif - using namespace CorUnix; /* ------------------- Definitions ------------------------------*/ diff --git a/src/pal/tests/palsuite/CMakeLists.txt b/src/pal/tests/palsuite/CMakeLists.txt index 235b695..0ea8969 100644 --- a/src/pal/tests/palsuite/CMakeLists.txt +++ b/src/pal/tests/palsuite/CMakeLists.txt @@ -4,6 +4,16 @@ project(PALTESTSUITE) include_directories(${PALTESTSUITE_SOURCE_DIR}/common) +# All test will link against these libraries: +# pthread and m are part of the Android C library (bionic), +# so we don't need to link them seperately +if(NOT CLR_CMAKE_PLATFORM_ANDROID) + list(APPEND COMMON_TEST_LIBRARIES pthread) + list(APPEND COMMON_TEST_LIBRARIES m) +endif() + +list(APPEND COMMON_TEST_LIBRARIES coreclrpal) + add_compile_options(-Wno-incompatible-pointer-types-discards-qualifiers) add_compile_options(-Wno-int-to-void-pointer-cast) diff --git a/src/pal/tests/palsuite/c_runtime/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/CMakeLists.txt index cf06253..7a6b2cd 100644 --- a/src/pal/tests/palsuite/c_runtime/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/CMakeLists.txt @@ -148,7 +148,6 @@ add_subdirectory(_fullpath) # TODO: make this test compile # add_subdirectory(_gcvt) -add_subdirectory(_getw) add_subdirectory(_isnan) add_subdirectory(_isnanf) add_subdirectory(_itow) @@ -157,7 +156,6 @@ add_subdirectory(_mbsinc) add_subdirectory(_mbsninc) add_subdirectory(_open_osfhandle) add_subdirectory(_putenv) -add_subdirectory(_putw) add_subdirectory(_rotl) add_subdirectory(_rotr) add_subdirectory(_snprintf_s) @@ -165,7 +163,7 @@ add_subdirectory(_snwprintf_s) add_subdirectory(_stricmp) add_subdirectory(_strlwr) add_subdirectory(_strnicmp) -add_subdirectory(_vsnprintf) +add_subdirectory(_vsnprintf_s) add_subdirectory(_vsnwprintf_s) add_subdirectory(_wcsicmp) add_subdirectory(_wcslwr) diff --git a/src/pal/tests/palsuite/c_runtime/__iscsym/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/__iscsym/test1/CMakeLists.txt index b4421e7..4dd4cf1 100644 --- a/src/pal/tests/palsuite/c_runtime/__iscsym/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/__iscsym/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_iscsym_test1 add_dependencies(paltest_iscsym_test1 coreclrpal) target_link_libraries(paltest_iscsym_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_alloca/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_alloca/test1/CMakeLists.txt index 434633b..97a351c 100644 --- a/src/pal/tests/palsuite/c_runtime/_alloca/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_alloca/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_alloca_test1 add_dependencies(paltest_alloca_test1 coreclrpal) target_link_libraries(paltest_alloca_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_ecvt/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_ecvt/test1/CMakeLists.txt index e78a802..152271c 100644 --- a/src/pal/tests/palsuite/c_runtime/_ecvt/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_ecvt/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_ecvt_test1 add_dependencies(paltest_ecvt_test1 coreclrpal) target_link_libraries(paltest_ecvt_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_fdopen/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_fdopen/test1/CMakeLists.txt index 60b036f..a389b83 100644 --- a/src/pal/tests/palsuite/c_runtime/_fdopen/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_fdopen/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_fdopen_test1 add_dependencies(paltest_fdopen_test1 coreclrpal) target_link_libraries(paltest_fdopen_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_finite/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_finite/test1/CMakeLists.txt index ac2f25d..a376d45 100644 --- a/src/pal/tests/palsuite/c_runtime/_finite/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_finite/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_finite_test1 add_dependencies(paltest_finite_test1 coreclrpal) target_link_libraries(paltest_finite_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_finitef/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_finitef/test1/CMakeLists.txt index 9ef630f..a9785e0 100644 --- a/src/pal/tests/palsuite/c_runtime/_finitef/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_finitef/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_finitef_test1 add_dependencies(paltest_finitef_test1 coreclrpal) target_link_libraries(paltest_finitef_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_fullpath/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_fullpath/test1/CMakeLists.txt index 0c9029f..2915738 100644 --- a/src/pal/tests/palsuite/c_runtime/_fullpath/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_fullpath/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_fullpath_test1 add_dependencies(paltest_fullpath_test1 coreclrpal) target_link_libraries(paltest_fullpath_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_gcvt/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_gcvt/test1/CMakeLists.txt index 47dcb95..25c652d 100644 --- a/src/pal/tests/palsuite/c_runtime/_gcvt/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_gcvt/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_gcvt_test1 add_dependencies(paltest_gcvt_test1 coreclrpal) target_link_libraries(paltest_gcvt_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_gcvt/test2/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_gcvt/test2/CMakeLists.txt index 5b0f560..b77bff9 100644 --- a/src/pal/tests/palsuite/c_runtime/_gcvt/test2/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_gcvt/test2/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_gcvt_test2 add_dependencies(paltest_gcvt_test2 coreclrpal) target_link_libraries(paltest_gcvt_test2 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_getw/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_getw/CMakeLists.txt deleted file mode 100644 index f6aa0cb..0000000 --- a/src/pal/tests/palsuite/c_runtime/_getw/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12.2) - -add_subdirectory(test1) - diff --git a/src/pal/tests/palsuite/c_runtime/_getw/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_getw/test1/CMakeLists.txt deleted file mode 100644 index 4f763be..0000000 --- a/src/pal/tests/palsuite/c_runtime/_getw/test1/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12.2) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(SOURCES - test1.cpp -) - -add_executable(paltest_getw_test1 - ${SOURCES} -) - -add_dependencies(paltest_getw_test1 coreclrpal) - -target_link_libraries(paltest_getw_test1 - pthread - m - coreclrpal -) diff --git a/src/pal/tests/palsuite/c_runtime/_getw/test1/test.dat b/src/pal/tests/palsuite/c_runtime/_getw/test1/test.dat Binary files differdeleted file mode 100644 index b20eae0..0000000 --- a/src/pal/tests/palsuite/c_runtime/_getw/test1/test.dat +++ /dev/null diff --git a/src/pal/tests/palsuite/c_runtime/_getw/test1/test1.cpp b/src/pal/tests/palsuite/c_runtime/_getw/test1/test1.cpp deleted file mode 100644 index 34ce4ee..0000000 --- a/src/pal/tests/palsuite/c_runtime/_getw/test1/test1.cpp +++ /dev/null @@ -1,96 +0,0 @@ -// 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. - -/*============================================================================ -** -** Source: test1.c -** -** Purpose: Several integers are read from a previously written file -** using _getw. The test passes if the values read match those known to -** be in the file. -** -** -**==========================================================================*/ - -#include <palsuite.h> - -/*Tests _getw using a previously written data file */ -int __cdecl main(int argc, char **argv) -{ - const int testValues[] = - { - 0, - 1, - -1, - 0x7FFFFFFF, /* largest positive integer on 32 bit systems */ - 0x80000000, /* largest negative integer on 32 bit systems */ - 0xFFFFFFFF, - 0xFFFFAAAA - }; - - int i = 0; - int input = 0; - - const char filename[] = "test.dat"; - - - FILE *fp = NULL; - - /* - * Initialize the PAL and return FAIL if this fails - */ - if (0 != (PAL_Initialize(argc, argv))) - { - return FAIL; - } - - /* write the file that we will use to test */ - - - /* - Don't uncomment this code, it was used to create the data file - initially on windows, but if it is run on all test platforms, the - tests will always pass. - - fp = fopen(filename, "w"); - if (fp == NULL) - { - Fail("Unable to open file for write.\n"); - } - for (i = 0; i < sizeof(testValues) / sizeof(testValues[0]); i++) - { - _putw(testValues[i], fp); - } - - if (fclose(fp) != 0) - { - Fail("Error closing file after writing to it with _putw.\n"); - } - */ - - - /*Now read values back from the file and see if they match.*/ - fp = fopen(filename, "r"); - if (fp == NULL) - { - Fail ("Unable to open file for read.\n"); - } - for (i = 0; i < sizeof(testValues) / sizeof(testValues[0]); i++) - { - input = _getw(fp); - if (VAL32(input) != testValues[i]) - { - Fail ("_getw did not get the expected values when reading " - "from a file.\n"); - } - } - - if (fclose(fp) != 0) - { - Fail ("Error closing file after reading from it with _getw\n"); - } - PAL_Terminate(); - return PASS; -} - diff --git a/src/pal/tests/palsuite/c_runtime/_getw/test1/testinfo.dat b/src/pal/tests/palsuite/c_runtime/_getw/test1/testinfo.dat deleted file mode 100644 index 4044dad..0000000 --- a/src/pal/tests/palsuite/c_runtime/_getw/test1/testinfo.dat +++ /dev/null @@ -1,15 +0,0 @@ -# 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. - -Version = 1.0 -Section = C Runtime -Function = _getw -Name = Positive Test for _getw -TYPE = DEFAULT -EXE1 = test1 -Description -=Several integers are read from a previously written file -=using _getw. The test passes if the values read match those known to -=be in the file. - diff --git a/src/pal/tests/palsuite/c_runtime/_isnan/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_isnan/test1/CMakeLists.txt index 106ccb9..8c949ed 100644 --- a/src/pal/tests/palsuite/c_runtime/_isnan/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_isnan/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_isnan_test1 add_dependencies(paltest_isnan_test1 coreclrpal) target_link_libraries(paltest_isnan_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_isnanf/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_isnanf/test1/CMakeLists.txt index a8d42aa..485c30e 100644 --- a/src/pal/tests/palsuite/c_runtime/_isnanf/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_isnanf/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_isnanf_test1 add_dependencies(paltest_isnanf_test1 coreclrpal) target_link_libraries(paltest_isnanf_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_itow/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_itow/test1/CMakeLists.txt index 2c5d57b..bbeeb48 100644 --- a/src/pal/tests/palsuite/c_runtime/_itow/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_itow/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_itow_test1 add_dependencies(paltest_itow_test1 coreclrpal) target_link_libraries(paltest_itow_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_mbsdec/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_mbsdec/test1/CMakeLists.txt index b016f27..96319ac 100644 --- a/src/pal/tests/palsuite/c_runtime/_mbsdec/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_mbsdec/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_mbsdec_test1 add_dependencies(paltest_mbsdec_test1 coreclrpal) target_link_libraries(paltest_mbsdec_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_mbsinc/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_mbsinc/test1/CMakeLists.txt index c7325b9..7e3a015 100644 --- a/src/pal/tests/palsuite/c_runtime/_mbsinc/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_mbsinc/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_mbsinc_test1 add_dependencies(paltest_mbsinc_test1 coreclrpal) target_link_libraries(paltest_mbsinc_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_mbsninc/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_mbsninc/test1/CMakeLists.txt index 81c6c23..26a44c9 100644 --- a/src/pal/tests/palsuite/c_runtime/_mbsninc/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_mbsninc/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_mbsninc_test1 add_dependencies(paltest_mbsninc_test1 coreclrpal) target_link_libraries(paltest_mbsninc_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_open_osfhandle/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_open_osfhandle/test1/CMakeLists.txt index f4fedb6..503a6d9 100644 --- a/src/pal/tests/palsuite/c_runtime/_open_osfhandle/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_open_osfhandle/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_open_osfhandle_test1 add_dependencies(paltest_open_osfhandle_test1 coreclrpal) target_link_libraries(paltest_open_osfhandle_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_open_osfhandle/test2/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_open_osfhandle/test2/CMakeLists.txt index 6086868..e37cec2 100644 --- a/src/pal/tests/palsuite/c_runtime/_open_osfhandle/test2/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_open_osfhandle/test2/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_open_osfhandle_test2 add_dependencies(paltest_open_osfhandle_test2 coreclrpal) target_link_libraries(paltest_open_osfhandle_test2 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_putenv/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_putenv/test1/CMakeLists.txt index 9096bc1..e49d53f 100644 --- a/src/pal/tests/palsuite/c_runtime/_putenv/test1/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_putenv/test1/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_putenv_test1 add_dependencies(paltest_putenv_test1 coreclrpal) target_link_libraries(paltest_putenv_test1 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_putenv/test2/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_putenv/test2/CMakeLists.txt index ad99eba..6c6d139 100644 --- a/src/pal/tests/palsuite/c_runtime/_putenv/test2/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_putenv/test2/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_putenv_test2 add_dependencies(paltest_putenv_test2 coreclrpal) target_link_libraries(paltest_putenv_test2 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_putenv/test3/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_putenv/test3/CMakeLists.txt index fc97b95..2d98fd1 100644 --- a/src/pal/tests/palsuite/c_runtime/_putenv/test3/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_putenv/test3/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_putenv_test3 add_dependencies(paltest_putenv_test3 coreclrpal) target_link_libraries(paltest_putenv_test3 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_putenv/test4/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_putenv/test4/CMakeLists.txt index 3881626..9bcd973 100644 --- a/src/pal/tests/palsuite/c_runtime/_putenv/test4/CMakeLists.txt +++ b/src/pal/tests/palsuite/c_runtime/_putenv/test4/CMakeLists.txt @@ -13,7 +13,5 @@ add_executable(paltest_putenv_test4 add_dependencies(paltest_putenv_test4 coreclrpal) target_link_libraries(paltest_putenv_test4 - pthread - m - coreclrpal + ${COMMON_TEST_LIBRARIES} ) diff --git a/src/pal/tests/palsuite/c_runtime/_putw/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_putw/CMakeLists.txt deleted file mode 100644 index f6aa0cb..0000000 --- a/src/pal/tests/palsuite/c_runtime/_putw/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12.2) - -add_subdirectory(test1) - diff --git a/src/pal/tests/palsuite/c_runtime/_putw/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_putw/test1/CMakeLists.txt deleted file mode 100644 index 78833d4..0000000 --- a/src/pal/tests/palsuite/c_runtime/_putw/test1/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12.2) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(SOURCES - test1.cpp -) - -add_executable(paltest_putw_test1 - ${SOURCES} -) - -add_dependencies(paltest_putw_test1 coreclrpal) - -target_link_libraries(paltest_putw_test1 - pthread - m - coreclrpal -) diff --git a/src/pal/tests/palsuite/c_runtime/_putw/test1/test1.cpp b/src/pal/tests/palsuite/c_runtime/_putw/test1/test1.cpp deleted file mode 100644 index 02b7cc7..0000000 --- a/src/pal/tests/palsuite/c_runtime/_putw/test1/test1.cpp +++ /dev/null @@ -1,112 +0,0 @@ -// 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. - -/*============================================================================ -** -** Source: test1.c -** -** Purpose: Writes a series of integers to a file, test.dat, -** then verifies the results. -** -** Dependency: fopen(...) -** fclose(...) -** CloseHandle(...) -** DeleteFileA(...) -** _getw(...) -** -** -** -**==========================================================================*/ - - -#include <palsuite.h> - -const char testFileName[] = "test.dat"; - -static void Cleanup(HANDLE hFile) -{ - if (fclose((PAL_FILE*)hFile)) - { - Trace("_putw: ERROR -> Unable to close file \"%s\".\n", - testFileName); - } - if (!DeleteFileA(testFileName)) - { - Trace("_putw: ERROR -> Unable to delete file \"%s\". ", - "GetLastError returned %u.\n", - testFileName, - GetLastError()); - } -} - - -int __cdecl main(int argc, char **argv) -{ - - FILE * pfTest = NULL; - int testArray[] = {0,1,-1,0x7FFFFFFF,0x80000000,0xFFFFFFFF,0xFFFFAAAA}; - int i = 0; - int retValue = 0; - - /* - * Initialize the PAL and return FAIL if this fails - */ - if (0 != (PAL_Initialize(argc, argv))) - { - return FAIL; - } - - /*write the file that we will use to test */ - pfTest = fopen(testFileName, "w"); - if (pfTest == NULL) - { - Fail ("Unable to write test file.\n"); - } - - for (i = 0; i < sizeof(testArray)/sizeof(int) ; i++) - { - _putw(testArray[i], pfTest); - - if( ferror( pfTest ) ) - { - Cleanup(pfTest); - Fail( "Error:in _putw -> error has occurred in the " - "stream while writing to the file: \"test.dat\"\n"); - } - - } - - if (fclose(pfTest) != 0) - { - Cleanup(pfTest); - Fail ("Error closing file after writing with _putw(..).\n"); - } - - /*open the new test file and compare*/ - pfTest = fopen(testFileName, "r"); - if (pfTest == NULL) - { - Fail ("Error opening \"%s\", which is odd, since I just finished " - "creating that file.\n", testFileName); - } - retValue =_getw( pfTest ); - i = 0; - while(retValue != EOF) - { - if(retValue != testArray[i]) - { - Cleanup(pfTest); - Fail ("Integers written by _putw are not in the correct format\n", - testFileName); - } - retValue = _getw( pfTest ); - i++ ; - } - - Cleanup(pfTest); - PAL_Terminate(); - return PASS; -} - - diff --git a/src/pal/tests/palsuite/c_runtime/_putw/test1/testinfo.dat b/src/pal/tests/palsuite/c_runtime/_putw/test1/testinfo.dat deleted file mode 100644 index 3007b82..0000000 --- a/src/pal/tests/palsuite/c_runtime/_putw/test1/testinfo.dat +++ /dev/null @@ -1,13 +0,0 @@ -# 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. - -Version = 1.0 -Section = C Runtime -Function = _putw -Name = Positive test for _putw -TYPE = DEFAULT -EXE1 = test1 -Description -= Several integers are written to a new file using _putw. This file is -= closed, reopened and read from to verify the writes were successful. diff --git a/src/pal/tests/palsuite/c_runtime/_rotl/test1/CMakeLists.txt b/src/pal/tests/palsuite/c_runtime/_rotl/test1/CMakeLists.txt |