📄 ccopts.sh
字号:
# generic Opteron/Athlon64/K8/Athlon FX processors, but also works for
# Intel's x86-64.
#
# Unfortunately handling of "-march=native" is pretty comprehensively broken
# for the gcc 4.2 versions because of the hit-and-miss way that the
# information is passed by the compiler driver to the compiler back-end.
# Sometimes it works, sometimes it produces a "bad value (native) for
# -march= switch; bad value (native) for -mtune= switch" error, and
# sometimes it just bails out and falls back to "-march= generic" which
# often produces very poor code. As a result it's not safe to enable the
# use of this option.
#
# If this ever gets fixed it can be enabled with:
#
# if [ "$GCC_VER" -ge 43 ] ; then
# CCARGS="$CCARGS -march=native" ;
# elif [ "$GCC_VER" -ge 30 ] ; then
#
# (or whatever version gcc starts handling it properly at).
if [ "$ARCH" = "i586" -o "$ARCH" = "i686" -o "$ARCH" = "x86_64" ] ; then
if [ "$GCC_VER" -ge 30 ] ; then
case $ARCH in
'x86_64')
CCARGS="$CCARGS -march=opteron" ;;
'i686')
CCARGS="$CCARGS -march=pentiumpro" ;;
*)
CCARGS="$CCARGS -march=pentium" ;;
esac ;
else
CCARGS="$CCARGS -mcpu=pentium" ;
fi ;
fi
# gcc 4.x for 64-bit architectures has an optimiser bug that removes an
# empty-list check in cryptlib's list-management code (this has been
# verified for at least 4.0.x and 4.1.x for x86-64 and ppc64). When running
# the self-test, this is first detectable in cert/dn.c in the function
# deleteComponent(), where the missing check for an empty list causes a
# segfault when the code tries to access a nonexistent list element.
# There's not much that we can do about this except warn the user.
#
# (Update: Rearranging some lines in the source causes the compiler to emit
# correct code, so hopefully this shouldn't be necessary any longer).
#
# In theory we should also use '-s' for read to turn off echoing of
# keystrokes, however not all shells (e.g. Debian's stupid dash, which is
# symlinked to /bin/sh in some distros) support this.
#
#if [ "$GCC_VER" -ge 40 -a '(' "$ARCH" = "x86_64" -o "$ARCH" = "ppc64" ')' ] ; then
# echo >&2 ;
# echo "Warning: The version of gcc that this system uses has an optimiser bug in" >&2 ;
# echo " its 64-bit code generation. If the cryptlib self-test segfaults" >&2 ;
# echo " during the certificate self-test, rebuild the code with -O2" >&2 ;
# echo " instead of the current -O3." >&2 ;
# read -n1 -p "Hit a key..." ;
# echo >&2 ;
#fi
# gcc 4.x changed the way that it performs optimisation so that -O3 often
# results in the creation of far larger binaries than -O2, with ensuing poor
# cache localisation properties. In addition it enhances the triggering of
# gcc optimiser bugs, something that seems to be particularly bad in 4.x.
# While cryptlib contains numerous code-generation bug workarounds for gcc 4.x
# (and 3.x, and 2.x),the potential performance problems with -O3 means that
# it's better to just turn it off.
if [ "$OSNAME" = "Linux" -o "$OSNAME" = "FreeBSD" -o \
"$OSNAME" = "NetBSD" -o "$OSNAME" = "OpenBSD" -o \
"$OSNAME" = "Darwin" ] ; then
if [ $GCC_VER -ge 40 ] ; then
CCARGS="$CCARGS -O2" ;
else
CCARGS="$CCARGS -O3" ;
fi ;
fi
# Check for gcc 4.x with its stupid default setting of -Wpointer-sign,
# which leads to endless warnings about signed vs.unsigned char problems -
# you can't even call strlen() without getting warnings.
#
# Older versions of Solaris' sh can't handle the test below as a single line
# so we have to break it apart into two lines. In addition without the
# backquotes the script will silently exit at this point (!!) so we quote the
# argument to 'test'.
#
# Unfortunately enabling C99 with gcc (see below) also enables the C99
# aliasing rules, or at least endless whiny warnings about potential
# problems with C99 aliasing rules, reported as type punning by gcc 4.x.
# Because of the way the cryptlib kernel works there's no way to work around
# this (well, except for horrible kludges with unions) because it uses a
# generic message-payload type that's always passed as a void *. There's no
# easy way to fix this, we could in theory perform a massive janitorial run-
# through applying intermediate void casts between source and target (e.g.
# '( struct foo * ) ( void * ) whatever') but this just masks the problem,
# makes the code look ugly, and could quite well hide other problems because
# of the make-it-go-away void cast. Telling the compiler to shut is far
# cleaner, since it doesn't seem to have any effect on the code generated
# anyway.
if [ $GCC_VER -ge 40 ] ; then
if [ `$CC -Wno-pointer-sign -S -o /dev/null -xc /dev/null 2>&1 | grep -c "unrecog"` -eq 0 ] ; then
CCARGS="$CCARGS -Wno-pointer-sign" ;
fi ;
CCARGS="$CCARGS -Wno-strict-aliasing" ;
fi
# The AES code uses 64-bit data types, which gcc doesn't support (at least
# via limits.h) unless it's operating in C99 mode. So in order to have the
# AES auto-config work we have to explicitly run gcc in C99 mode, which
# isn't the default for the gcc 3.x versions. Since the code also uses gcc
# extensions we have to specify the mode as gcc + C99, not just C99.
# Finally, older versions of gcc don't understand C99 so we have to surround
# this with a guard based on the version number.
if [ $GCC_VER -ge 30 ] ; then
CCARGS="$CCARGS -std=gnu99" ;
fi
# Newer versions of gcc support marking the stack as nonexecutable (e.g.
# using the x86-64 NX bit), so if it's available we enable it. This is
# easier than the alternative of adding a:
#
# #if defined( __linux__ ) && defined( __ELF__ )
# .section .note.GNU-stack, "", %progbits
# #endif
#
# to .S files since (a) we don't control most of the .S files and (b)
# some of the code is inline asm in C functions.
#
# Unfortunately this isn't possible to check for easily, at best we can
# do something like:
#
# if (echo|as --noexecstack -o /dev/null > /dev/null 2>&1); then
# CCARGS="$CCARGS -Wa,--noexecstack" ;
# fi
#
# (which is necessary because no two assemblers have a consistent command-
# line interface so that we can't even reliably get version information as
# we can for gcc) but even this is problematic because even if the assembler
# claims to support it actual handling is still rather hit-and-miss.
# Enable additional compiler diagnostics if we're building on the usual
# development box. We only enable it on this one system to avoid having
# users complain about getting warnings when they build it.
#
# An even higher level of noise can be enabled with -Wall, however in this
# case -Wno-switch is necessary because all cryptlib attributes are declared
# from a single pool of enums, but only the values for a particular object
# class are used in the object-specific code, leading to huge numbers of
# warnings about unhandled enum values in case statements. So the extra
# flags are "-Wall -Wno-switch".
#
# The warnings are:
#
# -Waggregate-return: Warn about functions that return structs.
#
# -Wcast-align: Warn whenever a pointer is cast such that the required
# alignment of the target is increased, for example if a "char *" is
# cast to an "int *".
#
# -Wchar-subscripts: Warn when an array has a char subscript (-Wall).
#
# -Wendif-labels: Warn if an endif is followed by text.
#
# -Wformat: Check calls to "printf" etc to make sure that the args supplied
# have types appropriate to the format string (-Wall).
#
# -Wformat-nonliteral: Check whether a format string is not a string literal,
# i.e. argPtr vs "%s".
#
# -Wformat-security: Check for potential security problems in format strings.
#
# -Wimplicit-int: Warn about typeless variable declarations (-Wall)
#
# -Wmissing-braces: Warn if an array initialiser isn't fully bracketed, e.g.
# int a[2][2] = { 0, 1, 2, 3 } (-Wall).
#
# -Wparentheses: Warn about missing parantheses where the resulting
# expression is ambiguous (or at least nonobvious) (-Wall).
#
# -Wnonnull: Warn about passing a null for function args tagged as being
# __nonnull (-Wall).
#
# -Wpointer-arith: Warn about anything that depends on the sizeof a
# function type or of void.
#
# -Wredundant-decls: Warn if anything is declared more than once in the same
# scope.
#
# -Wsequence-point: Warn about sequence point violations, e.g. a = a++ (-Wall).
#
# -Wshadow: Warn whenever a local variable shadows another local variable,
# parameter or global variable (that is, a local of the same name as
# an existing variable is declared in a nested scope). Note that this
# leads to some false positives as gcc treats forward declarations of
# functions within earlier functions that have the same parameters as
# the function they're declared within as shadowing. This can be
# usually detected in the output by noting that a pile of supposedly
# shadow declarations occur within a few lines of one another.
#
# -Wstrict-prototypes: Warn if a function is declared or defined K&R-style.
#
# -Wunused-function: Warn if a static function isn't used (-Wall).
#
# -Wunused-label: Warn if a label isn't used (-Wall).
#
# -Wunused-variable: Warn if a local variable isn't used (-Wall).
#
# -Wundef: Warn if an undefined identifier is used in a #if.
#
# -Wwrite-strings: Warn on attempts to assign/use a constant string value
# with a non-const pointer.
#
# Note that some of these require the use of at least -O2 in order to be
# detected because they require the use of various levels of data flow
# analysis by the compiler.
#
# Warnings that we don't use due to excessive false positives:
#
# -Wuninitialized: Warn about used-before-initialised. The detection of this
# isn't very good, variables initialised conditionally always produce
# warnings.
#
# -Wunreachable-code: The use of -O2/-O3 interacts badly with this due to
# statements rearranged by the optimiser being declared unreachable.
#
# Finally there's also -Wextra, which warns about even more potential
# problems, at the cost of more false positives.
#
# In addition to the standard warnings we also enable the use of gcc
# attributes warn_unused_result and nonnull, which are too broken (and in
# the case of nonnull far too dangerous) to use in production code (see the
# long comment in analyse.h for details).
if [ `uname -n` = "wintermute01.cs.auckland.ac.nz" ] ; then
CCARGS="$CCARGS -Wall -Wno-switch -Waggregate-return -Wcast-align \
-Wformat-nonliteral -Wformat-security -Wpointer-arith \
-Wredundant-decls -Wshadow -Wstrict-prototypes -Wundef" ;
CCARGS="$CCARGS -DUSE_GCC_ATTRIBUTES" ;
fi
# if [ `uname -n` = "wintermute01.cs.auckland.ac.nz" ] ; then
# CCARGS="$CCARGS -Wcast-align -Wendif-labels -Wformat -Wformat-nonliteral \
# -Wformat-security -Wimplicit-int -Wmissing-braces \
# -Wnonnull -Wparentheses -Wpointer-arith -Wredundant-decls \
# -Wsequence-point -Wshadow -Wstrict-prototypes \
# -Wunused-function -Wunused-label -Wunused-variable -Wundef \
# -Wwrite-strings" ;
# fi
# Finally, report what we've found
echo $CCARGS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -