blob: fe8d15033fcbe6b2994ac1d177741b4bbf11b3de [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package main
import (
"strings"
)
func processSanitizerFlags(builder *commandBuilder) {
hasCoverageFlags := false
hasSanitizeFlags := false
hasSanitizeFuzzerFlags := false
for _, arg := range builder.args {
// TODO: This should probably be -fsanitize= to not match on
// e.g. -fsanitize-blacklist
if arg.fromUser {
if strings.HasPrefix(arg.value, "-fsanitize") {
hasSanitizeFlags = true
if strings.Contains(arg.value, "fuzzer") {
hasSanitizeFuzzerFlags = true
}
} else if arg.value == "-fprofile-instr-generate" {
hasCoverageFlags = true
}
}
}
if hasSanitizeFlags {
// Flags not supported by sanitizers (ASan etc.)
unsupportedSanitizerFlags := map[string]bool{
"-D_FORTIFY_SOURCE=1": true,
"-D_FORTIFY_SOURCE=2": true,
"-Wl,--no-undefined": true,
"-Wl,-z,defs": true,
}
builder.transformArgs(func(arg builderArg) string {
// TODO: This is a bug in the old wrapper to not filter
// non user args for gcc. Fix this once we don't compare to the old wrapper anymore.
if (builder.target.compilerType != gccType || arg.fromUser) &&
unsupportedSanitizerFlags[arg.value] {
return ""
}
return arg.value
})
if builder.target.compilerType == clangType {
// hasSanitizeFlags && hasCoverageFlags is to work around crbug.com/1013622
if hasSanitizeFuzzerFlags || (hasSanitizeFlags && hasCoverageFlags) {
fuzzerFlagsToAdd := []string{
// TODO: This flag should be removed once fuzzer works with new pass manager
"-fno-experimental-new-pass-manager",
}
builder.addPreUserArgs(fuzzerFlagsToAdd...)
}
}
}
}