Skip to content

Commit

Permalink
ICU-20382 ICU4C: pkgdata and genccode support ARM32 but not ARM64 on …
Browse files Browse the repository at this point in the history
…Windows platforms.
  • Loading branch information
jefgen committed Feb 8, 2019
1 parent b918212 commit 11e538b
Showing 1 changed file with 21 additions and 14 deletions.
35 changes: 21 additions & 14 deletions icu4c/source/tools/toolutil/pkg_genc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -680,23 +680,30 @@ getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char
*pBits=32;
*pIsBigEndian=(UBool)(U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB);
#elif U_PLATFORM_HAS_WIN32_API
/* _M_IA64 should be defined in windows.h */
# if defined(_M_IA64)
*pCPU=IMAGE_FILE_MACHINE_IA64;
*pBits = 64;
# elif defined(_M_AMD64)
// link.exe does not really care about the .obj machine type and this will
// allow us to build a dll for both ARM & x64 with an amd64 built tool
// ARM is same as x64 except for first 2 bytes of object file
*pCPU = IMAGE_FILE_MACHINE_UNKNOWN;
// *pCPU = IMAGE_FILE_MACHINE_ARMNT; // If we wanted to be explicit
// *pCPU = IMAGE_FILE_MACHINE_AMD64; // We would use one of these names
*pBits = 64; // Doesn't seem to be used for anything interesting?
// Windows always runs in little-endian mode.
*pIsBigEndian = FALSE;

// Note: The various _M_<arch> macros are predefined by the MSVC compiler based
// on the target compilation architecture.
// https://docs.microsoft.com/cpp/preprocessor/predefined-macros

// link.exe will link an IMAGE_FILE_MACHINE_UNKNOWN data-only .obj file
// no matter what architecture it is targeting (though other values are
// required to match). Unfortunately, the variable name decoration/mangling
// is slightly different on x86, which means we can't use the UNKNOWN type
// for all architectures though.
# if defined(_M_IX86)
*pCPU = IMAGE_FILE_MACHINE_I386;
# else
*pCPU=IMAGE_FILE_MACHINE_I386; // We would use one of these names
*pCPU = IMAGE_FILE_MACHINE_UNKNOWN;
# endif
# if defined(_M_IA64) || defined(_M_AMD64) || defined (_M_ARM64)
*pBits = 64; // Doesn't seem to be used for anything interesting though?
# elif defined(_M_IX86) || defined(_M_ARM)
*pBits = 32;
# else
# error "Unknown platform for CAN_GENERATE_OBJECTS."
# endif
*pIsBigEndian=FALSE;
#else
# error "Unknown platform for CAN_GENERATE_OBJECTS."
#endif
Expand Down

0 comments on commit 11e538b

Please sign in to comment.