https://boringssl-review.googlesource.com/c/boringssl/+/62585 made the compiler emit multiple CRYPTO_library_init calls in functions which dispatch between a tower of alternatives. Ideally, the compiler would know that at most one call suffices. There doesn't seem to be such an attribute, but we can get the same effect with pure or const attributes. We tie init with returning the capability vector. On Intel, because the vector is so large, we have to go with a weaker version. Somewhat annoyingly, the getter must be out-of-line, because otherwise the compiler inlines first and loses the attribute. I went with pure because we allow our unit tests to mutate OPENSSL_armcap_P, which means the Arm one is, strictly speaking, pure, not const. This slightly reduces optimization potential, but should still allow deduping in most places. Confirmed that aes_init_key now only calls a helper function once. See discussion in https://boringssl-review.googlesource.com/c/boringssl/+/62585/comment/26083b88_b3db2b75/ Bug: 35 Change-Id: I9bc464f0e5a0ed9601017a5037028f906693a137 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/62985 Auto-Submit: David Benjamin <davidben@google.com> Reviewed-by: Bob Beck <bbe@google.com> Commit-Queue: Bob Beck <bbe@google.com>
38 lines
1.7 KiB
C
38 lines
1.7 KiB
C
/* Copyright (c) 2014, Google Inc.
|
|
*
|
|
* Permission to use, copy, modify, and/or distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
|
|
|
|
#include <ring-core/base.h>
|
|
|
|
#if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
|
|
// Our assembly does not use the GOT to reference symbols, which means
|
|
// references to visible symbols will often require a TEXTREL. This is
|
|
// undesirable, so all assembly-referenced symbols should be hidden. CPU
|
|
// capabilities are the only such symbols defined in C. Explicitly hide them,
|
|
// rather than rely on being built with -fvisibility=hidden.
|
|
#if defined(OPENSSL_WINDOWS)
|
|
#define HIDDEN
|
|
#else
|
|
#define HIDDEN __attribute__((visibility("hidden")))
|
|
#endif
|
|
|
|
// This value must be explicitly initialised to zero in order to work around a
|
|
// bug in libtool or the linker on OS X.
|
|
//
|
|
// If not initialised then it becomes a "common symbol". When put into an
|
|
// archive, linking on OS X will fail to resolve common symbols. By
|
|
// initialising it to zero, it becomes a "data symbol", which isn't so
|
|
// affected.
|
|
HIDDEN uint32_t OPENSSL_ia32cap_P[4] = {0};
|
|
#endif
|