blob: 32f2cb78bd9234c3b019552da0a1434f7f37ac30 [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) {
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 && strings.HasPrefix(arg.value, "-fsanitize") {
hasSanitizeFlags = true
if strings.Contains(arg.value, "fuzzer") {
hasSanitizeFuzzerFlags = 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 hasSanitizeFuzzerFlags && builder.target.compilerType == clangType {
fuzzerFlagsToAdd := []string{
// TODO: This flag should be removed once fuzzer works with new pass manager
"-fno-experimental-new-pass-manager",
}
builder.addPreUserArgs(fuzzerFlagsToAdd...)
}
}
}