You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
7.3 KiB
242 lines
7.3 KiB
// 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: "",
|
|
}
|