Skip to content

Commit 11e538b

Browse files
committed
ICU-20382 ICU4C: pkgdata and genccode support ARM32 but not ARM64 on Windows platforms.
1 parent b918212 commit 11e538b

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

icu4c/source/tools/toolutil/pkg_genc.cpp

+21-14
Original file line numberDiff line numberDiff line change
@@ -680,23 +680,30 @@ getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char
680680
*pBits=32;
681681
*pIsBigEndian=(UBool)(U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB);
682682
#elif U_PLATFORM_HAS_WIN32_API
683-
/* _M_IA64 should be defined in windows.h */
684-
# if defined(_M_IA64)
685-
*pCPU=IMAGE_FILE_MACHINE_IA64;
686-
*pBits = 64;
687-
# elif defined(_M_AMD64)
688-
// link.exe does not really care about the .obj machine type and this will
689-
// allow us to build a dll for both ARM & x64 with an amd64 built tool
690-
// ARM is same as x64 except for first 2 bytes of object file
691-
*pCPU = IMAGE_FILE_MACHINE_UNKNOWN;
692-
// *pCPU = IMAGE_FILE_MACHINE_ARMNT; // If we wanted to be explicit
693-
// *pCPU = IMAGE_FILE_MACHINE_AMD64; // We would use one of these names
694-
*pBits = 64; // Doesn't seem to be used for anything interesting?
683+
// Windows always runs in little-endian mode.
684+
*pIsBigEndian = FALSE;
685+
686+
// Note: The various _M_<arch> macros are predefined by the MSVC compiler based
687+
// on the target compilation architecture.
688+
// https://docs.microsoft.com/cpp/preprocessor/predefined-macros
689+
690+
// link.exe will link an IMAGE_FILE_MACHINE_UNKNOWN data-only .obj file
691+
// no matter what architecture it is targeting (though other values are
692+
// required to match). Unfortunately, the variable name decoration/mangling
693+
// is slightly different on x86, which means we can't use the UNKNOWN type
694+
// for all architectures though.
695+
# if defined(_M_IX86)
696+
*pCPU = IMAGE_FILE_MACHINE_I386;
695697
# else
696-
*pCPU=IMAGE_FILE_MACHINE_I386; // We would use one of these names
698+
*pCPU = IMAGE_FILE_MACHINE_UNKNOWN;
699+
# endif
700+
# if defined(_M_IA64) || defined(_M_AMD64) || defined (_M_ARM64)
701+
*pBits = 64; // Doesn't seem to be used for anything interesting though?
702+
# elif defined(_M_IX86) || defined(_M_ARM)
697703
*pBits = 32;
704+
# else
705+
# error "Unknown platform for CAN_GENERATE_OBJECTS."
698706
# endif
699-
*pIsBigEndian=FALSE;
700707
#else
701708
# error "Unknown platform for CAN_GENERATE_OBJECTS."
702709
#endif

0 commit comments

Comments
 (0)