summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Hansson <andreas.hansson@arm.com>2014-10-16 05:49:36 -0400
committerAndreas Hansson <andreas.hansson@arm.com>2014-10-16 05:49:36 -0400
commitb14f521e5f16f942a1f13a431dad2a72e8966f21 (patch)
tree99bb5d51faa8fd4a49eaf19978cd5c3e2373780a
parentded540a661d9ff572ca58cd2e990460b2518dc28 (diff)
downloadgem5-b14f521e5f16f942a1f13a431dad2a72e8966f21.tar.xz
scons: Add Undefined Behavior Sanitizer (UBSan) option
This patch adds the Undefined Behavior Sanitizer (UBSan) for clang and gcc >= 4.9. Due to the performance impact, the usage is guarded by a command-line option.
-rwxr-xr-xSConstruct11
-rwxr-xr-xsrc/SConscript15
2 files changed, 26 insertions, 0 deletions
diff --git a/SConstruct b/SConstruct
index 1d1b95711..1078a3e96 100755
--- a/SConstruct
+++ b/SConstruct
@@ -189,6 +189,8 @@ AddLocalOption('--without-python', dest='without_python',
AddLocalOption('--without-tcmalloc', dest='without_tcmalloc',
action='store_true',
help='Disable linking against tcmalloc')
+AddLocalOption('--with-ubsan', dest='with_ubsan', action='store_true',
+ help='Build with Undefined Behavior Sanitizer if available')
termcap = get_termcap(GetOption('use_colors'))
@@ -602,6 +604,15 @@ if main['GCC']:
'binutils to 2.23.' + \
termcap.Normal
+ # Make sure we warn if the user has requested to compile with the
+ # Undefined Benahvior Sanitizer and this version of gcc does not
+ # support it.
+ if GetOption('with_ubsan') and \
+ compareVersions(gcc_version, '4.9') < 0:
+ print termcap.Yellow + termcap.Bold + \
+ 'Warning: UBSan is only supported using gcc 4.9 and later.' + \
+ termcap.Normal
+
# Add the appropriate Link-Time Optimization (LTO) flags
# unless LTO is explicitly turned off. Note that these flags
# are only used by the fast target.
diff --git a/src/SConscript b/src/SConscript
index 3737ef51b..ef729cb33 100755
--- a/src/SConscript
+++ b/src/SConscript
@@ -953,6 +953,15 @@ def makeEnv(env, label, objsfx, strip = False, **kwargs):
if compareVersions(env['GCC_VERSION'], '4.7') >= 0:
new_env.Append(CXXFLAGS='-Wdelete-non-virtual-dtor')
swig_env.Append(CCFLAGS='-Wno-maybe-uninitialized')
+
+ # Only gcc >= 4.9 supports UBSan, so check both the version
+ # and the command-line option before adding the compiler and
+ # linker flags.
+ if GetOption('with_ubsan') and \
+ compareVersions(env['GCC_VERSION'], '4.9') >= 0:
+ new_env.Append(CCFLAGS='-fsanitize=undefined')
+ new_env.Append(LINKFLAGS='-fsanitize=undefined')
+
if env['CLANG']:
# Always enable the warning for deletion of derived classes
# with non-virtual destructors
@@ -966,6 +975,12 @@ def makeEnv(env, label, objsfx, strip = False, **kwargs):
'-Wno-deprecated-register',
])
+ # All supported clang versions have support for UBSan, so if
+ # asked to use it, append the compiler and linker flags.
+ if GetOption('with_ubsan'):
+ new_env.Append(CCFLAGS='-fsanitize=undefined')
+ new_env.Append(LINKFLAGS='-fsanitize=undefined')
+
werror_env = new_env.Clone()
werror_env.Append(CCFLAGS='-Werror')