summaryrefslogtreecommitdiff
path: root/SConstruct
diff options
context:
space:
mode:
authorRyan Egesdahl <ryan.egesdahl@mongodb.com>2020-07-30 11:03:02 -0700
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-08-22 00:08:36 +0000
commit20ed5d51cb1c82597f65967be69b81e6e72c0413 (patch)
tree8d13ec6da43103fca3acadfb3d7c0d514d801091 /SConstruct
parent29ec0810ceb3901b212ebdbf6b8a9ad993a15ba2 (diff)
downloadmongo-20ed5d51cb1c82597f65967be69b81e6e72c0413.tar.gz
SERVER-49857 Explicit llvm-symbolizer path handling with {A,T,UB}SAN
The toolchain llvm-symbolizer was never actually in PATH despite the toolchain being appended to it in evergreen.yml, causing confusion while attempting to diagnose an apparent symbolization failure. This change explicitly sets the path to llvm-symbolizer for all sanitizer build variants and removes the last vestiges of the non-working discovery method.
Diffstat (limited to 'SConstruct')
-rw-r--r--SConstruct47
1 files changed, 22 insertions, 25 deletions
diff --git a/SConstruct b/SConstruct
index f2ee0949028..a589b0f5246 100644
--- a/SConstruct
+++ b/SConstruct
@@ -273,11 +273,6 @@ add_option('sanitize-coverage',
metavar='cov1,cov2,...covN',
)
-add_option('llvm-symbolizer',
- default='llvm-symbolizer',
- help='name of (or path to) the LLVM symbolizer',
-)
-
add_option('allocator',
choices=["auto", "system", "tcmalloc", "tcmalloc-experimental"],
default="auto",
@@ -790,6 +785,9 @@ env_vars.Add('LINKFLAGS',
help='Sets flags for the linker',
converter=variable_shlex_converter)
+env_vars.Add('LLVM_SYMBOLIZER',
+ help='Name of or path to the LLVM symbolizer')
+
env_vars.Add('MAXLINELENGTH',
help='Maximum line length before using temp files',
# This is very small, but appears to be the least upper bound
@@ -2917,21 +2915,20 @@ def doConfigure(myenv):
LINKFLAGS="${SANITIZER_BLACKLIST_GENERATOR}",
)
- llvm_symbolizer = get_option('llvm-symbolizer')
- if os.path.isabs(llvm_symbolizer):
+ symbolizer_option = ""
+ if env['LLVM_SYMBOLIZER']:
+ llvm_symbolizer = env['LLVM_SYMBOLIZER']
+
+ if not os.path.isabs(llvm_symbolizer):
+ llvm_symbolizer = myenv.WhereIs(llvm_symbolizer)
+
if not myenv.File(llvm_symbolizer).exists():
- print("WARNING: Specified symbolizer '%s' not found" % llvm_symbolizer)
- llvm_symbolizer = None
- else:
- llvm_symbolizer = myenv.WhereIs(llvm_symbolizer)
+ myenv.FatalError(f"Symbolizer binary at path {llvm_symbolizer} does not exist")
+
+ symbolizer_option = f":external_symbolizer_path=\"{llvm_symbolizer}\""
- tsan_options = ""
- if llvm_symbolizer:
- myenv['ENV']['ASAN_SYMBOLIZER_PATH'] = llvm_symbolizer
- myenv['ENV']['LSAN_SYMBOLIZER_PATH'] = llvm_symbolizer
- tsan_options = "external_symbolizer_path=\"%s\" " % llvm_symbolizer
- elif using_asan:
- myenv.FatalError("Using the address sanitizer requires a valid symbolizer")
+ elif using_asan or using_tsan or using_ubsan:
+ myenv.FatalError("The address, thread, and undefined behavior sanitizers require llvm-symbolizer for meaningful reports")
if using_asan:
# Unfortunately, abseil requires that we make these macros
@@ -2943,10 +2940,10 @@ def doConfigure(myenv):
# If anything is changed, added, or removed in either asan_options or
# lsan_options, be sure to make the corresponding changes to the
# appropriate build variants in etc/evergreen.yml
- asan_options = "check_initialization_order=true:strict_init_order=true:abort_on_error=1:disable_coredump=0:handle_abort=1"
- lsan_options = "detect_leaks=1:report_objects=1:suppressions=%s" % myenv.File("#etc/lsan.suppressions").abspath
- env['ENV']['ASAN_OPTIONS'] = asan_options
- env['ENV']['LSAN_OPTIONS'] = lsan_options
+ asan_options = "detect_leaks=1:check_initialization_order=true:strict_init_order=true:abort_on_error=1:disable_coredump=0:handle_abort=1"
+ lsan_options = f"report_objects=1:suppressions={myenv.File('#etc/lsan.suppressions').abspath}"
+ env['ENV']['ASAN_OPTIONS'] = asan_options + symbolizer_option
+ env['ENV']['LSAN_OPTIONS'] = lsan_options + symbolizer_option
if using_tsan:
@@ -2975,8 +2972,8 @@ def doConfigure(myenv):
# reporting thread leaks, which we have because we don't
# do a clean shutdown of the ServiceContext.
#
- tsan_options += "halt_on_error=1:report_thread_leaks=0:die_after_fork=0:suppressions=\"%s\" " % myenv.File("#etc/tsan.suppressions").abspath
- myenv['ENV']['TSAN_OPTIONS'] = tsan_options
+ tsan_options = f"halt_on_error=1:report_thread_leaks=0:die_after_fork=0:suppressions={myenv.File('#etc/tsan.suppressions').abspath}"
+ myenv['ENV']['TSAN_OPTIONS'] = tsan_options + symbolizer_option
myenv.AppendUnique(CPPDEFINES=['THREAD_SANITIZER'])
if using_ubsan:
@@ -2992,7 +2989,7 @@ def doConfigure(myenv):
# sure to make the corresponding changes to the appropriate build
# variants in etc/evergreen.yml
ubsan_options = "print_stacktrace=1"
- myenv['ENV']['UBSAN_OPTIONS'] = ubsan_options
+ myenv['ENV']['UBSAN_OPTIONS'] = ubsan_options + symbolizer_option
if myenv.ToolchainIs('msvc') and optBuild:
# http://blogs.msdn.com/b/vcblog/archive/2013/09/11/introducing-gw-compiler-switch.aspx