diff options
author | Ryan Egesdahl <ryan.egesdahl@mongodb.com> | 2020-07-30 11:03:02 -0700 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-08-22 00:08:36 +0000 |
commit | 20ed5d51cb1c82597f65967be69b81e6e72c0413 (patch) | |
tree | 8d13ec6da43103fca3acadfb3d7c0d514d801091 /SConstruct | |
parent | 29ec0810ceb3901b212ebdbf6b8a9ad993a15ba2 (diff) | |
download | mongo-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-- | SConstruct | 47 |
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 |