Skip to content

Commit

Permalink
Address type mismatch warnings on aarch64
Browse files Browse the repository at this point in the history
The PROVIDER_INFO macro used in the aarch64 code declares all
functions with the signature:

extern void function(void);

The actual return type and parameter list of the functions are however
different. The declarations provided by the PROVIDER_INFO macro
therfore conflicts with the actual declarations of the functions
elsewhere in the code, causing compiler warnings.

This commit drops the PROVIDER_INFO macro and provides proper function
declarations, eiter by including a header file or by providing a
forward declaration. This corresponds to how the code for the other
architectures are handlinging this issue.

Signed-off-by: Mattias Ellert <[email protected]>
  • Loading branch information
ellert committed Jan 28, 2025
1 parent e3c2d24 commit da814c9
Show file tree
Hide file tree
Showing 6 changed files with 296 additions and 147 deletions.
121 changes: 82 additions & 39 deletions crc/aarch64/crc_aarch64_dispatcher.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,45 +27,88 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**********************************************************************/
#include <aarch64_multibinary.h>
#include "crc.h"
#include "crc64.h"

extern uint16_t
crc16_t10dif_pmull(uint16_t, uint8_t *, uint64_t);

extern uint16_t
crc16_t10dif_copy_pmull(uint16_t, uint8_t *, uint8_t *, uint64_t);

extern uint32_t
crc32_ieee_norm_pmull(uint32_t, uint8_t *, uint64_t);

extern unsigned int
crc32_iscsi_crc_ext(unsigned char *, int, unsigned int);
extern unsigned int
crc32_iscsi_3crc_fold(unsigned char *, int, unsigned int);
extern unsigned int
crc32_iscsi_refl_pmull(unsigned char *, int, unsigned int);

extern uint32_t
crc32_gzip_refl_crc_ext(uint32_t, uint8_t *, uint64_t);
extern uint32_t
crc32_gzip_refl_3crc_fold(uint32_t, uint8_t *, uint64_t);
extern uint32_t
crc32_gzip_refl_pmull(uint32_t, uint8_t *, uint64_t);

extern uint64_t
crc64_ecma_refl_pmull(uint64_t, const unsigned char *, uint64_t);

extern uint64_t
crc64_ecma_norm_pmull(uint64_t, const unsigned char *, uint64_t);

extern uint64_t
crc64_iso_refl_pmull(uint64_t, const unsigned char *, uint64_t);

extern uint64_t
crc64_iso_norm_pmull(uint64_t, const unsigned char *, uint64_t);

extern uint64_t
crc64_jones_refl_pmull(uint64_t, const unsigned char *, uint64_t);

extern uint64_t
crc64_jones_norm_pmull(uint64_t, const unsigned char *, uint64_t);

DEFINE_INTERFACE_DISPATCHER(crc16_t10dif)
{
#if defined(__linux__)
unsigned long auxval = getauxval(AT_HWCAP);
if (auxval & HWCAP_PMULL)
return PROVIDER_INFO(crc16_t10dif_pmull);
return crc16_t10dif_pmull;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_PMULL_KEY))
return PROVIDER_INFO(crc16_t10dif_pmull);
return crc16_t10dif_pmull;
#endif
return PROVIDER_BASIC(crc16_t10dif);
return crc16_t10dif_base;
}

DEFINE_INTERFACE_DISPATCHER(crc16_t10dif_copy)
{
#if defined(__linux__)
unsigned long auxval = getauxval(AT_HWCAP);
if (auxval & HWCAP_PMULL)
return PROVIDER_INFO(crc16_t10dif_copy_pmull);
return crc16_t10dif_copy_pmull;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_PMULL_KEY))
return PROVIDER_INFO(crc16_t10dif_copy_pmull);
return crc16_t10dif_copy_pmull;
#endif
return PROVIDER_BASIC(crc16_t10dif_copy);
return crc16_t10dif_copy_base;
}

DEFINE_INTERFACE_DISPATCHER(crc32_ieee)
{
#if defined(__linux__)
unsigned long auxval = getauxval(AT_HWCAP);
if (auxval & HWCAP_PMULL) {
return PROVIDER_INFO(crc32_ieee_norm_pmull);
return crc32_ieee_norm_pmull;
}
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_PMULL_KEY))
return PROVIDER_INFO(crc32_ieee_norm_pmull);
return crc32_ieee_norm_pmull;
#endif
return PROVIDER_BASIC(crc32_ieee);
return crc32_ieee_base;
}

DEFINE_INTERFACE_DISPATCHER(crc32_iscsi)
Expand All @@ -77,23 +120,23 @@ DEFINE_INTERFACE_DISPATCHER(crc32_iscsi)
case MICRO_ARCH_ID(ARM, NEOVERSE_N1):
case MICRO_ARCH_ID(ARM, CORTEX_A57):
case MICRO_ARCH_ID(ARM, CORTEX_A72):
return PROVIDER_INFO(crc32_iscsi_crc_ext);
return crc32_iscsi_crc_ext;
}
}
if ((HWCAP_CRC32 | HWCAP_PMULL) == (auxval & (HWCAP_CRC32 | HWCAP_PMULL))) {
return PROVIDER_INFO(crc32_iscsi_3crc_fold);
return crc32_iscsi_3crc_fold;
}

if (auxval & HWCAP_PMULL) {
return PROVIDER_INFO(crc32_iscsi_refl_pmull);
return crc32_iscsi_refl_pmull;
}
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_CRC32_KEY))
return PROVIDER_INFO(crc32_iscsi_3crc_fold);
return crc32_iscsi_3crc_fold;
if (sysctlEnabled(SYSCTL_PMULL_KEY))
return PROVIDER_INFO(crc32_iscsi_refl_pmull);
return crc32_iscsi_refl_pmull;
#endif
return PROVIDER_BASIC(crc32_iscsi);
return crc32_iscsi_base;
}

DEFINE_INTERFACE_DISPATCHER(crc32_gzip_refl)
Expand All @@ -106,22 +149,22 @@ DEFINE_INTERFACE_DISPATCHER(crc32_gzip_refl)
case MICRO_ARCH_ID(ARM, NEOVERSE_N1):
case MICRO_ARCH_ID(ARM, CORTEX_A57):
case MICRO_ARCH_ID(ARM, CORTEX_A72):
return PROVIDER_INFO(crc32_gzip_refl_crc_ext);
return crc32_gzip_refl_crc_ext;
}
}
if ((HWCAP_CRC32 | HWCAP_PMULL) == (auxval & (HWCAP_CRC32 | HWCAP_PMULL))) {
return PROVIDER_INFO(crc32_gzip_refl_3crc_fold);
return crc32_gzip_refl_3crc_fold;
}

if (auxval & HWCAP_PMULL)
return PROVIDER_INFO(crc32_gzip_refl_pmull);
return crc32_gzip_refl_pmull;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_CRC32_KEY))
return PROVIDER_INFO(crc32_gzip_refl_3crc_fold);
return crc32_gzip_refl_3crc_fold;
if (sysctlEnabled(SYSCTL_PMULL_KEY))
return PROVIDER_INFO(crc32_gzip_refl_pmull);
return crc32_gzip_refl_pmull;
#endif
return PROVIDER_BASIC(crc32_gzip_refl);
return crc32_gzip_refl_base;
}

DEFINE_INTERFACE_DISPATCHER(crc64_ecma_refl)
Expand All @@ -130,75 +173,75 @@ DEFINE_INTERFACE_DISPATCHER(crc64_ecma_refl)
unsigned long auxval = getauxval(AT_HWCAP);

if (auxval & HWCAP_PMULL)
return PROVIDER_INFO(crc64_ecma_refl_pmull);
return crc64_ecma_refl_pmull;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_PMULL_KEY))
return PROVIDER_INFO(crc64_ecma_refl_pmull);
return crc64_ecma_refl_pmull;
#endif
return PROVIDER_BASIC(crc64_ecma_refl);
return crc64_ecma_refl_base;
}

DEFINE_INTERFACE_DISPATCHER(crc64_ecma_norm)
{
#if defined(__linux__)
unsigned long auxval = getauxval(AT_HWCAP);
if (auxval & HWCAP_PMULL)
return PROVIDER_INFO(crc64_ecma_norm_pmull);
return crc64_ecma_norm_pmull;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_PMULL_KEY))
return PROVIDER_INFO(crc64_ecma_norm_pmull);
return crc64_ecma_norm_pmull;
#endif
return PROVIDER_BASIC(crc64_ecma_norm);
return crc64_ecma_norm_base;
}

DEFINE_INTERFACE_DISPATCHER(crc64_iso_refl)
{
#if defined(__linux__)
unsigned long auxval = getauxval(AT_HWCAP);
if (auxval & HWCAP_PMULL)
return PROVIDER_INFO(crc64_iso_refl_pmull);
return crc64_iso_refl_pmull;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_PMULL_KEY))
return PROVIDER_INFO(crc64_iso_refl_pmull);
return crc64_iso_refl_pmull;
#endif
return PROVIDER_BASIC(crc64_iso_refl);
return crc64_iso_refl_base;
}

DEFINE_INTERFACE_DISPATCHER(crc64_iso_norm)
{
#if defined(__linux__)
unsigned long auxval = getauxval(AT_HWCAP);
if (auxval & HWCAP_PMULL)
return PROVIDER_INFO(crc64_iso_norm_pmull);
return crc64_iso_norm_pmull;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_PMULL_KEY))
return PROVIDER_INFO(crc64_iso_norm_pmull);
return crc64_iso_norm_pmull;
#endif
return PROVIDER_BASIC(crc64_iso_norm);
return crc64_iso_norm_base;
}

DEFINE_INTERFACE_DISPATCHER(crc64_jones_refl)
{
#if defined(__linux__)
unsigned long auxval = getauxval(AT_HWCAP);
if (auxval & HWCAP_PMULL)
return PROVIDER_INFO(crc64_jones_refl_pmull);
return crc64_jones_refl_pmull;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_PMULL_KEY))
return PROVIDER_INFO(crc64_jones_refl_pmull);
return crc64_jones_refl_pmull;
#endif
return PROVIDER_BASIC(crc64_jones_refl);
return crc64_jones_refl_base;
}

DEFINE_INTERFACE_DISPATCHER(crc64_jones_norm)
{
#if defined(__linux__)
unsigned long auxval = getauxval(AT_HWCAP);
if (auxval & HWCAP_PMULL)
return PROVIDER_INFO(crc64_jones_norm_pmull);
return crc64_jones_norm_pmull;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_PMULL_KEY))
return PROVIDER_INFO(crc64_jones_norm_pmull);
return crc64_jones_norm_pmull;
#endif
return PROVIDER_BASIC(crc64_jones_norm);
return crc64_jones_norm_base;
}
87 changes: 61 additions & 26 deletions erasure_code/aarch64/ec_aarch64_dispatcher.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,22 +27,57 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**********************************************************************/
#include <aarch64_multibinary.h>
#include "erasure_code.h"
#include "gf_vect_mul.h"

extern void
gf_vect_dot_prod_sve(int, int, unsigned char *, unsigned char **,
unsigned char *);
extern void
gf_vect_dot_prod_neon(int, int, unsigned char *, unsigned char **,
unsigned char *);

extern void
gf_vect_mad_sve(int, int, int, unsigned char *, unsigned char *,
unsigned char *);
extern void
gf_vect_mad_neon(int, int, int, unsigned char *, unsigned char *,
unsigned char *);

extern void
ec_encode_data_sve(int, int, int, unsigned char *, unsigned char **,
unsigned char **coding);
extern void
ec_encode_data_neon(int, int, int, unsigned char *, unsigned char **,
unsigned char **);

extern void
ec_encode_data_update_sve(int, int, int, int, unsigned char *,
unsigned char *, unsigned char **);
extern void
ec_encode_data_update_neon(int, int, int, int, unsigned char *,
unsigned char *, unsigned char **);

extern int
gf_vect_mul_sve(int, unsigned char *, unsigned char *, unsigned char *);
extern int
gf_vect_mul_neon(int, unsigned char *, unsigned char *, unsigned char *);

DEFINE_INTERFACE_DISPATCHER(gf_vect_dot_prod)
{
#if defined(__linux__)
unsigned long auxval = getauxval(AT_HWCAP);

if (auxval & HWCAP_SVE)
return PROVIDER_INFO(gf_vect_dot_prod_sve);
return gf_vect_dot_prod_sve;
if (auxval & HWCAP_ASIMD)
return PROVIDER_INFO(gf_vect_dot_prod_neon);
return gf_vect_dot_prod_neon;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_SVE_KEY))
return PROVIDER_INFO(gf_vect_dot_prod_sve);
return PROVIDER_INFO(gf_vect_dot_prod_neon);
return gf_vect_dot_prod_sve;
return gf_vect_dot_prod_neon;
#endif
return PROVIDER_BASIC(gf_vect_dot_prod);
return gf_vect_dot_prod_base;
}

DEFINE_INTERFACE_DISPATCHER(gf_vect_mad)
Expand All @@ -51,15 +86,15 @@ DEFINE_INTERFACE_DISPATCHER(gf_vect_mad)
unsigned long auxval = getauxval(AT_HWCAP);

if (auxval & HWCAP_SVE)
return PROVIDER_INFO(gf_vect_mad_sve);
return gf_vect_mad_sve;
if (auxval & HWCAP_ASIMD)
return PROVIDER_INFO(gf_vect_mad_neon);
return gf_vect_mad_neon;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_SVE_KEY))
return PROVIDER_INFO(gf_vect_mad_sve);
return PROVIDER_INFO(gf_vect_mad_neon);
return gf_vect_mad_sve;
return gf_vect_mad_neon;
#endif
return PROVIDER_BASIC(gf_vect_mad);
return gf_vect_mad_base;
}

DEFINE_INTERFACE_DISPATCHER(ec_encode_data)
Expand All @@ -68,15 +103,15 @@ DEFINE_INTERFACE_DISPATCHER(ec_encode_data)
unsigned long auxval = getauxval(AT_HWCAP);

if (auxval & HWCAP_SVE)
return PROVIDER_INFO(ec_encode_data_sve);
return ec_encode_data_sve;
if (auxval & HWCAP_ASIMD)
return PROVIDER_INFO(ec_encode_data_neon);
return ec_encode_data_neon;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_SVE_KEY))
return PROVIDER_INFO(ec_encode_data_sve);
return PROVIDER_INFO(ec_encode_data_neon);
return ec_encode_data_sve;
return ec_encode_data_neon;
#endif
return PROVIDER_BASIC(ec_encode_data);
return ec_encode_data_base;
}

DEFINE_INTERFACE_DISPATCHER(ec_encode_data_update)
Expand All @@ -85,15 +120,15 @@ DEFINE_INTERFACE_DISPATCHER(ec_encode_data_update)
unsigned long auxval = getauxval(AT_HWCAP);

if (auxval & HWCAP_SVE)
return PROVIDER_INFO(ec_encode_data_update_sve);
return ec_encode_data_update_sve;
if (auxval & HWCAP_ASIMD)
return PROVIDER_INFO(ec_encode_data_update_neon);
return ec_encode_data_update_neon;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_SVE_KEY))
return PROVIDER_INFO(ec_encode_data_update_sve);
return PROVIDER_INFO(ec_encode_data_update_neon);
return ec_encode_data_update_sve;
return ec_encode_data_update_neon;
#endif
return PROVIDER_BASIC(ec_encode_data_update);
return ec_encode_data_update_base;
}

DEFINE_INTERFACE_DISPATCHER(gf_vect_mul)
Expand All @@ -102,15 +137,15 @@ DEFINE_INTERFACE_DISPATCHER(gf_vect_mul)
unsigned long auxval = getauxval(AT_HWCAP);

if (auxval & HWCAP_SVE)
return PROVIDER_INFO(gf_vect_mul_sve);
return gf_vect_mul_sve;
if (auxval & HWCAP_ASIMD)
return PROVIDER_INFO(gf_vect_mul_neon);
return gf_vect_mul_neon;
#elif defined(__APPLE__)
if (sysctlEnabled(SYSCTL_SVE_KEY))
return PROVIDER_INFO(gf_vect_mul_sve);
return PROVIDER_INFO(gf_vect_mul_neon);
return gf_vect_mul_sve;
return gf_vect_mul_neon;
#endif
return PROVIDER_BASIC(gf_vect_mul);
return gf_vect_mul_base;
}

DEFINE_INTERFACE_DISPATCHER(ec_init_tables) { return PROVIDER_BASIC(ec_init_tables); }
DEFINE_INTERFACE_DISPATCHER(ec_init_tables) { return ec_init_tables_base; }
Loading

0 comments on commit da814c9

Please sign in to comment.