diff options
author | Nick Mathewson <nickm@torproject.org> | 2016-05-18 09:44:05 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2016-05-18 09:50:38 -0400 |
commit | 6d6c8287d5e060117bfa066f87d4e2fc08ab708d (patch) | |
tree | c4a5cd552acc2037b7cfa1e656efd79357cfc0a1 /configure.ac | |
parent | 33034600c250068cb1c413ddf9dba894f8ca6182 (diff) | |
download | tor-6d6c8287d5e060117bfa066f87d4e2fc08ab708d.tar.gz tor-6d6c8287d5e060117bfa066f87d4e2fc08ab708d.zip |
Include __mulodi4 in libor_ctime when it fixes clang -m32 -ftrapv
We use a pretty specific pair of autoconf tests here to make sure
that we only add this code when:
a) a 64-bit signed multiply fails to link,
AND
b) the same 64-bit signed multiply DOES link correctly when
__mulodi4 is defined.
Closes ticket 19079.
Diffstat (limited to 'configure.ac')
-rw-r--r-- | configure.ac | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac index de59c752bc..8465b43262 100644 --- a/configure.ac +++ b/configure.ac @@ -801,6 +801,46 @@ fi CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN" CFLAGS_CONSTTIME="$CFLAGS_FWRAPV" +if test "$have_clang" = "yes"; then + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $CFLAGS_FTRAPV" + AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply]) + AC_LINK_IFELSE([ + AC_LANG_SOURCE([[ + #include <stdint.h> + #include <stdlib.h> + int main(int argc, char **argv) + { + int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2]) + * (int64_t)argv[3]; + return x == 9; + } ]])], + [ftrapv_can_link=yes; AC_MSG_RESULT([yes])], + [ftrapv_can_link=no; AC_MSG_RESULT([no])]) + mulodi_fixes_ftrapv=no + if test "$ftrapv_can_link" = "no"; then + AC_MSG_CHECKING([whether defining __mulodi4 fixes that]) + AC_LINK_IFELSE([ + AC_LANG_SOURCE([[ + #include <stdint.h> + #include <stdlib.h> + int64_t __mulodi4(int64_t a, int64_t b, int *overflow) { + *overflow=0; + return a; + } + int main(int argc, char **argv) + { + int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2]) + * (int64_t)argv[3]; + return x == 9; + } ]])], + [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])], + [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])]) + fi + AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes") + CFLAGS="$saved_CFLAGS" +fi + dnl These cflags add bunches of branches, and we haven't been able to dnl persuade ourselves that they're suitable for code that needs to be dnl constant time. |