]> granicus.if.org Git - icu/commitdiff
ICU-20382 ICU4C: pkgdata and genccode support ARM32 but not ARM64 on Windows platforms.
authorJeff Genovy <jefgen@microsoft.com>
Fri, 8 Feb 2019 19:31:12 +0000 (11:31 -0800)
committerJeff Genovy <29107334+jefgen@users.noreply.github.com>
Mon, 11 Feb 2019 20:31:29 +0000 (12:31 -0800)
icu4c/source/tools/toolutil/pkg_genc.cpp

index 13d73ceb4077fe519827b5ad692fdd5b66c523ad..ae8b3ece973071a9a776100c091d271d74aa64e2 100644 (file)
@@ -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