Skip to content

Commit

Permalink
Add two new build targets to enable the possibility of using clang-cl as
Browse files Browse the repository at this point in the history
an assembler for Windows on Arm builds and also clang-cl as the compiler
as well. Make appropriate changes to armcap source and peralsm scripts.

Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Hugo Landau <hlandau@openssl.org>
(Merged from openssl#19523)
  • Loading branch information
everton1984 authored and beldmit committed Dec 26, 2022
1 parent 71573e1 commit 3f31443
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 3 deletions.
35 changes: 35 additions & 0 deletions Configurations/50-win-clang-cl.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
## -*- mode: perl; -*-
# Windows on Arm clang-cl targets.
#

my %targets = (
"VC-WIN64-CLANGASM-ARM" => {
inherit_from => [ "VC-noCE-common" ],
defines => add("_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE",
"OPENSSL_SYS_WIN_CORE"),
bn_ops => "SIXTY_FOUR_BIT RC4_CHAR",
multilib => "-arm64",
asm_arch => "aarch64",
AS => "clang-cl.exe",
ASFLAGS => "/nologo /Zi",
asflags => "/c",
asoutflag => "/Fo",
perlasm_scheme => "win64",
uplink_arch => 'armv8',
},
"VC-CLANG-WIN64-CLANGASM-ARM" => {
CC => "clang-cl",
inherit_from => [ "VC-noCE-common" ],
defines => add("_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE",
"OPENSSL_SYS_WIN_CORE"),
bn_ops => "SIXTY_FOUR_BIT RC4_CHAR",
multilib => "-arm64",
asm_arch => "aarch64",
AS => "clang-cl.exe",
ASFLAGS => "/nologo /Zi",
asflags => "/c",
asoutflag => "/Fo",
perlasm_scheme => "win64",
uplink_arch => 'armv8',
},
);
2 changes: 1 addition & 1 deletion Configurations/windows-makefile.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -780,7 +780,7 @@ EOF
}
return <<"EOF";
$target: "$gen0" $deps
\$(CPP) $incs $cppflags $defs "$gen0" > \$@.i
\$(CPP) /D__ASSEMBLER__ $incs $cppflags $defs "$gen0" > \$@.i
move /Y \$@.i \$@
EOF
} elsif ($gen0 =~ m|^.*\.in$|) {
Expand Down
25 changes: 23 additions & 2 deletions crypto/armcap.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,36 @@
#include <sys/sysctl.h>
#endif
#include "internal/cryptlib.h"
#ifndef _WIN32
#include <unistd.h>

#else
#include <windows.h>
#endif
#include "arm_arch.h"

unsigned int OPENSSL_armcap_P = 0;
unsigned int OPENSSL_arm_midr = 0;
unsigned int OPENSSL_armv8_rsa_neonized = 0;

#if __ARM_MAX_ARCH__<7
#ifdef _WIN32
void OPENSSL_cpuid_setup(void)
{
OPENSSL_armcap_P |= ARMV7_NEON;
OPENSSL_armv8_rsa_neonized = 1;
if (IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE)) {
// These are all covered by one call in Windows
OPENSSL_armcap_P |= ARMV8_AES;
OPENSSL_armcap_P |= ARMV8_PMULL;
OPENSSL_armcap_P |= ARMV8_SHA1;
OPENSSL_armcap_P |= ARMV8_SHA256;
}
}

uint32_t OPENSSL_rdtsc(void)
{
return 0;
}
#elif __ARM_MAX_ARCH__<7
void OPENSSL_cpuid_setup(void)
{
}
Expand Down
11 changes: 11 additions & 0 deletions crypto/perlasm/arm-xlate.pl
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
################################################################
my $arch = sub {
if ($flavour =~ /linux/) { ".arch\t".join(',',@_); }
elsif ($flavour =~ /win64/) { ".arch\t".join(',',@_); }
else { ""; }
};
my $fpu = sub {
Expand All @@ -37,6 +38,7 @@
};
my $hidden = sub {
if ($flavour =~ /ios/) { ".private_extern\t".join(',',@_); }
elsif ($flavour =~ /win64/) { ""; }
else { ".hidden\t".join(',',@_); }
};
my $comm = sub {
Expand Down Expand Up @@ -85,6 +87,15 @@
"#endif";
}
}
elsif ($flavour =~ /win64/) { if (join(',',@_) =~ /(\w+),%function/) {
# See https://sourceware.org/binutils/docs/as/Pseudo-Ops.html
# Per https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#coff-symbol-table,
# the type for functions is 0x20, or 32.
".def $1\n".
" .type 32\n".
".endef";
}
}
else { ""; }
};
my $size = sub {
Expand Down

0 comments on commit 3f31443

Please sign in to comment.