diff options
author | David Benjamin <davidben@google.com> | 2018-09-23 18:36:01 -0500 |
---|---|---|
committer | CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org> | 2018-10-01 22:57:00 +0000 |
commit | a943613e4060fd19258e4ae82491af8f98d5e2a1 (patch) | |
tree | bb09e41fa9a26650f636680cddb873534611a881 /include/openssl/cpu.h | |
parent | 7c3ce519e80122fa3ba326dc0aa5c8576ccd1250 (diff) | |
download | boringssl-a943613e4060fd19258e4ae82491af8f98d5e2a1.zip boringssl-a943613e4060fd19258e4ae82491af8f98d5e2a1.tar.gz boringssl-a943613e4060fd19258e4ae82491af8f98d5e2a1.tar.bz2 |
Inline functions are apparently really complicated.
C and C++ handle inline functions differently. In C++, an inline function is
defined in just the header file, potentially emitted in multiple compilation
units (in cases the compiler did not inline), but each copy must be identical
to satsify ODR. In C, a non-static inline must be manually emitted in exactly
one compilation unit with a separate extern inline declaration.
In both languages, exported inline functions referencing file-local symbols are
problematic. C forbids this altogether (though GCC and Clang seem not to
enforce it). It works in C++, but ODR requires the definitions be identical,
including all names in the definitions resolving to the "same entity". In
practice, this is unlikely to be a problem, but an inline function that returns
a pointer to a file-local symbol could compile oddly.
Historically, we used static inline in headers. However, to satisfy ODR, use
plain inline in C++, to allow inline consumer functions to call our header
functions. Plain inline would also work better with C99 inline, but that is not
used much in practice, extern inline is tedious, and there are conflicts with
the old gnu89 model: https://stackoverflow.com/questions/216510/extern-inline
For dual C/C++ code, use a macro to dispatch between these. For C++-only
code, stop using static inline and just use plain inline.
Update-Note: If you see weird C++ compile or link failures in header
functions, this change is probably to blame. Though this change
doesn't affect C and non-static inline is extremely common in C++,
so I would expect this to be fine.
Change-Id: Ibb0bf8ff57143fc14e10342854e467f85a5e4a82
Reviewed-on: https://boringssl-review.googlesource.com/32116
Commit-Queue: David Benjamin <davidben@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
Reviewed-by: Adam Langley <agl@google.com>
Diffstat (limited to 'include/openssl/cpu.h')
-rw-r--r-- | include/openssl/cpu.h | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/include/openssl/cpu.h b/include/openssl/cpu.h index bb847f9..b2759fe 100644 --- a/include/openssl/cpu.h +++ b/include/openssl/cpu.h @@ -96,7 +96,7 @@ extern uint32_t OPENSSL_ia32cap_P[4]; #if defined(BORINGSSL_FIPS) const uint32_t *OPENSSL_ia32cap_get(void); #else -static inline const uint32_t *OPENSSL_ia32cap_get(void) { +OPENSSL_INLINE const uint32_t *OPENSSL_ia32cap_get(void) { return OPENSSL_ia32cap_P; } #endif @@ -119,7 +119,7 @@ OPENSSL_EXPORT char CRYPTO_is_NEON_capable_at_runtime(void); // CRYPTO_is_NEON_capable returns true if the current CPU has a NEON unit. If // this is known statically then it returns one immediately. -static inline int CRYPTO_is_NEON_capable(void) { +OPENSSL_INLINE int CRYPTO_is_NEON_capable(void) { // Only statically skip the runtime lookup on aarch64. On arm, one CPU is // known to have a broken NEON unit which is known to fail with on some // hand-written NEON assembly. For now, continue to apply the workaround even @@ -152,7 +152,7 @@ int CRYPTO_is_ARMv8_PMULL_capable(void); #else -static inline int CRYPTO_is_NEON_capable(void) { +OPENSSL_INLINE int CRYPTO_is_NEON_capable(void) { #if defined(OPENSSL_STATIC_ARMCAP_NEON) || defined(__ARM_NEON__) return 1; #else @@ -160,7 +160,7 @@ static inline int CRYPTO_is_NEON_capable(void) { #endif } -static inline int CRYPTO_is_ARMv8_AES_capable(void) { +OPENSSL_INLINE int CRYPTO_is_ARMv8_AES_capable(void) { #if defined(OPENSSL_STATIC_ARMCAP_AES) || defined(__ARM_FEATURE_CRYPTO) return 1; #else @@ -168,7 +168,7 @@ static inline int CRYPTO_is_ARMv8_AES_capable(void) { #endif } -static inline int CRYPTO_is_ARMv8_PMULL_capable(void) { +OPENSSL_INLINE int CRYPTO_is_ARMv8_PMULL_capable(void) { #if defined(OPENSSL_STATIC_ARMCAP_PMULL) || defined(__ARM_FEATURE_CRYPTO) return 1; #else |