blob: 8b5432b8acd5aa7fdccd517e7a7620dce6230314 [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 (
"strconv"
)
type config struct {
// TODO: Refactor this flag into more generic configuration properties.
isHostWrapper bool
isAndroidWrapper bool
// Whether to use ccache.
useCCache bool
// Whether llvmNext wrapper.
useLlvmNext bool
// Flags to add to gcc and clang.
commonFlags []string
// Flags to add to gcc only.
gccFlags []string
// Flags to add to clang only.
clangFlags []string
// Flags to add to clang only, AFTER user flags (cannot be overridden
// by the user).
clangPostFlags []string
// Toolchain root path relative to the wrapper binary.
rootRelPath string
// Directory to store errors that were prevented with -Wno-error.
newWarningsDir string
// Directory to store nits in when using `WITH_TIDY=tricium`.
triciumNitsDir string
// Directory to store crash artifacts in.
crashArtifactsDir string
// Version. Only used for printing via -print-cmd.
version string
}
// Version can be set via a linker flag.
// Values fills config.version.
var Version = ""
// UseCCache can be set via a linker flag.
// Value will be passed to strconv.ParseBool.
// E.g. go build -ldflags '-X config.UseCCache=true'.
var UseCCache = "unknown"
// UseLlvmNext can be set via a linker flag.
// Value will be passed to strconv.ParseBool.
// E.g. go build -ldflags '-X config.UseLlvmNext=true'.
var UseLlvmNext = "unknown"
// ConfigName can be set via a linker flag.
// Value has to be one of:
// - "cros.hardened"
// - "cros.nonhardened"
var ConfigName = "unknown"
// Returns the configuration matching the UseCCache and ConfigName.
func getRealConfig() (*config, error) {
useCCache, err := strconv.ParseBool(UseCCache)
if err != nil {
return nil, wrapErrorwithSourceLocf(err, "invalid format for UseCCache")
}
useLlvmNext, err := strconv.ParseBool(UseLlvmNext)
if err != nil {
return nil, wrapErrorwithSourceLocf(err, "invalid format for UseLLvmNext")
}
config, err := getConfig(ConfigName, useCCache, useLlvmNext, Version)
if err != nil {
return nil, err
}
return config, nil
}
func isAndroidConfig() bool {
return ConfigName == "android"
}
func getConfig(configName string, useCCache bool, useLlvmNext bool, version string) (*config, error) {
cfg := config{}
switch configName {
case "cros.hardened":
cfg = *crosHardenedConfig
case "cros.nonhardened":
cfg = *crosNonHardenedConfig
case "cros.host":
cfg = *crosHostConfig
case "android":
cfg = *androidConfig
default:
return nil, newErrorwithSourceLocf("unknown config name: %s", configName)
}
cfg.useCCache = useCCache
cfg.useLlvmNext = useLlvmNext
if useLlvmNext {
cfg.clangFlags = append(cfg.clangFlags, llvmNextFlags...)
cfg.clangPostFlags = append(cfg.clangPostFlags, llvmNextPostFlags...)
}
cfg.version = version
return &cfg, nil
}
// Full hardening.
// Temporarily disable function splitting because of chromium:434751.
var crosHardenedConfig = &config{
rootRelPath: "../../../../..",
commonFlags: []string{
"-fstack-protector-strong",
"-fPIE",
"-pie",
"-D_FORTIFY_SOURCE=2",
"-fno-omit-frame-pointer",
},
gccFlags: []string{
"-fno-reorder-blocks-and-partition",
"-Wno-unused-local-typedefs",
"-Wno-maybe-uninitialized",
},
// Temporarily disable tautological-*-compare chromium:778316.
// Temporarily add no-unknown-warning-option to deal with old clang versions.
// Temporarily disable Wsection since kernel gets a bunch of these. chromium:778867
// Disable "-faddrsig" since it produces object files that strip doesn't understand, chromium:915742.
// Pass "-fcommon" till the packages are fixed to work with new clang default
// "-fno-common", crbug.com/1060413.
// crbug.com/1103065: -grecord-gcc-switches pollutes the Goma cache;
// removed that flag for now.
clangFlags: []string{
"-Qunused-arguments",
"-fno-addrsig",
"-fcommon",
"-Wno-tautological-constant-compare",
"-Wno-tautological-unsigned-enum-zero-compare",
"-Wno-unknown-warning-option",
"-Wno-section",
"-static-libgcc",
"-fuse-ld=lld",
"-Wno-final-dtor-non-final-class",
"-Werror=poison-system-directories",
"-fexperimental-new-pass-manager",
"-Wno-compound-token-split-by-macro",
},
clangPostFlags: []string{
"-Wno-implicit-int-float-conversion",
"-Wno-compound-token-split-by-space",
"-Wno-string-concatenation",
},
newWarningsDir: "/tmp/fatal_clang_warnings",
triciumNitsDir: "/tmp/linting_output/clang-tidy",
crashArtifactsDir: "/tmp/clang_crash_diagnostics",
}
// Flags to be added to non-hardened toolchain.
var crosNonHardenedConfig = &config{
rootRelPath: "../../../../..",
commonFlags: []string{},
gccFlags: []string{
"-Wno-maybe-uninitialized",
"-Wno-unused-local-typedefs",
"-Wno-deprecated-declarations",
"-Wtrampolines",
},
// Temporarily disable tautological-*-compare chromium:778316.
// Temporarily add no-unknown-warning-option to deal with old clang versions.
// Temporarily disable Wsection since kernel gets a bunch of these. chromium:778867
clangFlags: []string{
"-Qunused-arguments",
"-Wno-tautological-constant-compare",
"-Wno-tautological-unsigned-enum-zero-compare",
"-Wno-unknown-warning-option",
"-Wno-section",
"-static-libgcc",
"-Wno-final-dtor-non-final-class",
"-Werror=poison-system-directories",
"-fexperimental-new-pass-manager",
"-Wno-compound-token-split-by-macro",
},
clangPostFlags: []string{
"-Wno-implicit-int-float-conversion",
"-Wno-compound-token-split-by-space",
"-Wno-string-concatenation",
},
newWarningsDir: "/tmp/fatal_clang_warnings",
triciumNitsDir: "/tmp/linting_output/clang-tidy",
crashArtifactsDir: "/tmp/clang_crash_diagnostics",
}
// Flags to be added to host toolchain.
var crosHostConfig = &config{
isHostWrapper: true,
rootRelPath: "../..",
commonFlags: []string{},
gccFlags: []string{
"-Wno-maybe-uninitialized",
"-Wno-unused-local-typedefs",
"-Wno-deprecated-declarations",
},
// Temporarily disable tautological-*-compare chromium:778316.
// Temporarily add no-unknown-warning-option to deal with old clang versions.
// Pass "-fcommon" till the packages are fixed to work with new clang default
// "-fno-common", crbug.com/1060413.
// crbug.com/1103065: -grecord-gcc-switches pollutes the Goma cache;
// removed that flag for now.
clangFlags: []string{
"-Qunused-arguments",
"-fno-addrsig",
"-fcommon",
"-fuse-ld=lld",
"-Wno-unused-local-typedefs",
"-Wno-deprecated-declarations",
"-Wno-tautological-constant-compare",
"-Wno-tautological-unsigned-enum-zero-compare",
"-Wno-final-dtor-non-final-class",
"-Werror=poison-system-directories",
"-Wno-unknown-warning-option",
"-fexperimental-new-pass-manager",
"-Wno-compound-token-split-by-macro",
},
clangPostFlags: []string{
"-Wno-implicit-int-float-conversion",
"-Wno-compound-token-split-by-space",
"-Wno-string-concatenation",
},
newWarningsDir: "/tmp/fatal_clang_warnings",
triciumNitsDir: "/tmp/linting_output/clang-tidy",
crashArtifactsDir: "/tmp/clang_crash_diagnostics",
}
var androidConfig = &config{
isHostWrapper: false,
isAndroidWrapper: true,
rootRelPath: "./",
commonFlags: []string{},
gccFlags: []string{},
clangFlags: []string{},
clangPostFlags: []string{},
newWarningsDir: "",
triciumNitsDir: "",
crashArtifactsDir: "",
}