From daf98015aac8bf392cf95edf9a54d845c1c22fd7 Mon Sep 17 00:00:00 2001 From: Tanzinul Islam Date: Sun, 13 Dec 2020 18:04:43 +0000 Subject: 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 Reviewed-by: Dmitry Belyavskiy (Merged from https://github.com/openssl/openssl/pull/13540) --- ms/applink.c | 6 ++++++ ms/uplink.c | 19 +++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) (limited to 'ms') 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 # include +# ifdef __BORLANDC__ + /* _lseek in 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..." -- cgit v1.2.3