| // 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...) |
| } |
| } |
| } |
| } |