diff options
author | Tanzinul Islam <tanzinul.islam@gmail.com> | 2020-12-13 18:04:43 +0000 |
---|---|---|
committer | Dmitry Belyavskiy <beldmit@gmail.com> | 2021-04-19 11:05:55 +0200 |
commit | daf98015aac8bf392cf95edf9a54d845c1c22fd7 (patch) | |
tree | 41115c55897351b29f572e0132a5cfaa83f8cb68 | |
parent | 491a1e3363228e8276ee293a86acd7a961ffe9d3 (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)
-rw-r--r-- | Configurations/50-cppbuilder.conf | 1 | ||||
-rw-r--r-- | crypto/bio/bss_file.c | 2 | ||||
-rw-r--r-- | ms/applink.c | 6 | ||||
-rw-r--r-- | 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 <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..." |