From daf98015aac8bf392cf95edf9a54d845c1c22fd7 Mon Sep 17 00:00:00 2001 From: Tanzinul Islam Date: Sun, 13 Dec 2020 18:04:43 +0000 Subject: [PATCH] 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) --- Configurations/50-cppbuilder.conf | 1 + crypto/bio/bss_file.c | 2 +- ms/applink.c | 6 ++++++ ms/uplink.c | 19 +++++++++++++++++-- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Configurations/50-cppbuilder.conf b/Configurations/50-cppbuilder.conf index b604e12d09..0b3b70db92 100644 --- a/Configurations/50-cppbuilder.conf +++ b/Configurations/50-cppbuilder.conf @@ -51,5 +51,6 @@ my %targets = ( dso_scheme => "win32", shared_defflag => '', perl_platform => 'Windows::cppbuilder', + uplink_arch => 'common', } ); diff --git a/crypto/bio/bss_file.c b/crypto/bio/bss_file.c index 981a5e7b59..41c3a59665 100644 --- a/crypto/bio/bss_file.c +++ b/crypto/bio/bss_file.c @@ -216,7 +216,7 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) # define _IOB_ENTRIES 20 # endif /* Safety net to catch purely internal BIO_set_fp calls */ -# if defined(_MSC_VER) && _MSC_VER>=1900 +# if (defined(_MSC_VER) && _MSC_VER>=1900) || defined(__BORLANDC__) if (ptr == stdin || ptr == stdout || ptr == stderr) BIO_clear_flags(b, BIO_FLAGS_UPLINK_INTERNAL); # elif defined(_IOB_ENTRIES) 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..." -- 2.34.1