summaryrefslogtreecommitdiffstats
path: root/ms
diff options
context:
space:
mode:
authorTanzinul Islam <tanzinul.islam@gmail.com>2020-12-13 18:04:43 +0000
committerDmitry Belyavskiy <beldmit@gmail.com>2021-04-19 11:05:55 +0200
commitdaf98015aac8bf392cf95edf9a54d845c1c22fd7 (patch)
tree41115c55897351b29f572e0132a5cfaa83f8cb68 /ms
parent491a1e3363228e8276ee293a86acd7a961ffe9d3 (diff)
Link with uplink module
The Clang-based `bcc32c.exe` expects AT&T syntax for inline assembly. References: - http://docwiki.embarcadero.com/RADStudio/Sydney/en/Differences_Between_Clang-enhanced_C%2B%2B_Compilers_and_Previous-Generation_C%2B%2B_Compilers#Inline_Assembly - https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html - https://sourceware.org/binutils/docs/as/i386_002dVariations.html Reviewed-by: Richard Levitte <levitte@openssl.org> Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540)
Diffstat (limited to 'ms')
-rw-r--r--ms/applink.c6
-rw-r--r--ms/uplink.c19
2 files changed, 23 insertions, 2 deletions
diff --git a/ms/applink.c b/ms/applink.c
index d19966a33e..2cf3a92f18 100644
--- a/ms/applink.c
+++ b/ms/applink.c
@@ -38,6 +38,12 @@
# include <io.h>
# include <fcntl.h>
+# ifdef __BORLANDC__
+ /* _lseek in <io.h> is a function-like macro so we can't take its address */
+# undef _lseek
+# define _lseek lseek
+# endif
+
static void *app_stdin(void)
{
return stdin;
diff --git a/ms/uplink.c b/ms/uplink.c
index 8c61a7ed1d..f924eb3e58 100644
--- a/ms/uplink.c
+++ b/ms/uplink.c
@@ -99,14 +99,29 @@ void OPENSSL_Uplink(volatile void **table, int index)
table[index] = func;
}
-#if defined(_MSC_VER) && defined(_M_IX86)
-# define LAZY(i) \
+#if (defined(_MSC_VER) || defined(__BORLANDC__)) && defined(_M_IX86)
+# if defined(_MSC_VER)
+# define LAZY(i) \
__declspec(naked) static void lazy##i (void) { \
_asm push i \
_asm push OFFSET OPENSSL_UplinkTable \
_asm call OPENSSL_Uplink \
_asm add esp,8 \
_asm jmp OPENSSL_UplinkTable+4*i }
+# elif defined(__BORLANDC__) && defined(__clang__)
+void *OPENSSL_UplinkTable[26]; /* C++Builder requires declaration before use */
+# define LAZY(i) \
+__declspec(naked) static void lazy##i (void) { \
+ __asm__("pushl $" #i "; " \
+ "pushl %0; " \
+ "call %P1; " \
+ "addl $8, %%esp; " \
+ "jmp *%2 " \
+ : /* no outputs */ \
+ : "i" (OPENSSL_UplinkTable), \
+ "i" (OPENSSL_Uplink), \
+ "m" (OPENSSL_UplinkTable[i])); }
+# endif
# if APPLINK_MAX>25
# error "Add more stubs..."