[CRT] Use alias names for rot functions when compiling with Clang-CL
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Sun, 3 Feb 2019 22:36:49 +0000 (23:36 +0100)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Tue, 12 Feb 2019 18:31:33 +0000 (19:31 +0100)
Clang-CL does not support #pragma function like CL. The alternative to this approach is to disable all intrinsics for this single source file, but that is not trivial to do, as it can only be done by removing a compiler switch, which we have no CMake support for. Therefore this solution is simpler and as good.

sdk/lib/crt/crt.cmake
sdk/lib/crt/stdlib/clang-alias.s [new file with mode: 0644]
sdk/lib/crt/stdlib/rot.c

index a6a7e5d..144a600 100644 (file)
@@ -441,6 +441,10 @@ if(ARCH STREQUAL "i386")
         list(APPEND CRT_ASM_SOURCE
             except/i386/cpp.s)
     endif()
+    if(USE_CLANG_CL)
+        list(APPEND CRT_ASM_SOURCE
+            stdlib/clang-alias.s)
+    endif()
 elseif(ARCH STREQUAL "amd64")
     list(APPEND CRT_ASM_SOURCE
         except/amd64/seh.s
diff --git a/sdk/lib/crt/stdlib/clang-alias.s b/sdk/lib/crt/stdlib/clang-alias.s
new file mode 100644 (file)
index 0000000..5655007
--- /dev/null
@@ -0,0 +1,22 @@
+#include <asm.inc>
+
+.code
+
+MACRO(DEFINE_ALIAS, alias, orig, type)
+EXTERN &orig:&type
+ALIAS <&alias> = <&orig>
+ENDM
+
+#ifdef _M_X64
+DEFINE_ALIAS _rotl, __function_rotl
+DEFINE_ALIAS _rotr, __function_rotr
+DEFINE_ALIAS _lrotl, __function_lrotl
+DEFINE_ALIAS _lrotr, __function_lrotr
+#else
+DEFINE_ALIAS __rotl, ___function_rotl
+DEFINE_ALIAS __rotr, ___function_rotr
+DEFINE_ALIAS __lrotl, ___function_lrotl
+DEFINE_ALIAS __lrotr, ___function_lrotr
+#endif
+
+END
index 7637a5e..3c4b613 100644 (file)
 
 #include <stdlib.h>
 
-#ifdef _MSC_VER
+#ifdef __clang__
+#define _rotl __function_rotl
+#define _rotr __function_rotr
+#define _lrotl __function_lrotl
+#define _lrotr __function_lrotr
+#elif defined(_MSC_VER)
 #pragma function(_rotr, _rotl, _rotr, _lrotl, _lrotr)
 #endif
 
 unsigned int _rotr( unsigned int value, int shift );
+unsigned long _lrotr(unsigned long value, int shift);
+
 /*
  * @implemented
  */
@@ -43,7 +50,6 @@ unsigned int _rotr( unsigned int value, int shift )
        return (value >> shift) | (value <<  (max_bits-shift));
 }
 
-
 /*
  * @implemented
  */