// Copyright 2019 The ChromiumOS 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.
	clangRootRelPath string
	gccRootRelPath   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 exposed via -print-config.
	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
}

func crosCommonClangFlags() []string {
	// Temporarily disable tautological-*-compare chromium:778316.
	// Temporarily add no-unknown-warning-option to deal with old clang versions.
	// Temporarily disable Wdeprecated-declarations. b/193860318
	// b/230345382: Temporarily disable Wimplicit-function-declaration.
	// b/231987783: Temporarily disable Wimplicit-int.
	return []string{
		"-Qunused-arguments",
		"-Werror=poison-system-directories",
		"-Wno-compound-token-split-by-macro",
		"-Wno-deprecated-declarations",
		"-Wno-error=implicit-function-declaration",
		"-Wno-error=implicit-int",
		"-Wno-final-dtor-non-final-class",
		"-Wno-tautological-constant-compare",
		"-Wno-tautological-unsigned-enum-zero-compare",
		"-Wno-unknown-warning-option",
		"-fdebug-default-version=5",
		"-fexperimental-new-pass-manager",
	}
}

func crosCommonClangPostFlags() []string {
	// Temporarily disable Wdeprecated-copy. b/191479033
	return []string{
		"-Wno-compound-token-split-by-space",
		"-Wno-deprecated-copy",
		"-Wno-implicit-int-float-conversion",
		"-Wno-string-concatenation",
	}
}

// Full hardening.
// Temporarily disable function splitting because of chromium:434751.
var crosHardenedConfig = config{
	clangRootRelPath: "../..",
	gccRootRelPath:   "../../../../..",
	// Pass "-fcommon" till the packages are fixed to work with new clang/gcc
	// default of "-fno-common", crbug.com/1060413.
	commonFlags: []string{
		"-fcommon",
		"-fstack-protector-strong",
		"-D_FORTIFY_SOURCE=2",
		"-fno-omit-frame-pointer",
	},
	gccFlags: []string{
		"-fno-reorder-blocks-and-partition",
		"-Wno-unused-local-typedefs",
		"-Wno-maybe-uninitialized",
	},
	// 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.
	// crbug.com/1103065: -grecord-gcc-switches pollutes the Goma cache;
	//   removed that flag for now.
	clangFlags: append(
		crosCommonClangFlags(),
		"--unwindlib=libunwind",
		"-Wno-section",
		"-fno-addrsig",
		"-fuse-ld=lld",
	),
	clangPostFlags:    crosCommonClangPostFlags(),
	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{
	clangRootRelPath: "../..",
	gccRootRelPath:   "../../../../..",
	commonFlags:      []string{},
	gccFlags: []string{
		"-Wno-maybe-uninitialized",
		"-Wno-unused-local-typedefs",
		"-Wno-deprecated-declarations",
		"-Wtrampolines",
	},
	// Temporarily disable Wsection since kernel gets a bunch of these. chromium:778867
	clangFlags: append(
		crosCommonClangFlags(),
		"-Wno-section",
	),
	clangPostFlags:    crosCommonClangPostFlags(),
	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,
	clangRootRelPath: "../..",
	gccRootRelPath:   "../..",
	// Pass "-fcommon" till the packages are fixed to work with new clang/gcc
	// default of "-fno-common", crbug.com/1060413.
	commonFlags: []string{
		"-fcommon",
	},
	gccFlags: []string{
		"-Wno-maybe-uninitialized",
		"-Wno-unused-local-typedefs",
		"-Wno-deprecated-declarations",
	},
	// crbug.com/1103065: -grecord-gcc-switches pollutes the Goma cache;
	//   removed that flag for now.
	clangFlags: append(
		crosCommonClangFlags(),
		"-Wno-unused-local-typedefs",
		"-fno-addrsig",
		"-fuse-ld=lld",
	),
	// Temporarily disable Wdeprecated-copy. b/191479033
	clangPostFlags:    crosCommonClangPostFlags(),
	newWarningsDir:    "/tmp/fatal_clang_warnings",
	triciumNitsDir:    "/tmp/linting_output/clang-tidy",
	crashArtifactsDir: "/tmp/clang_crash_diagnostics",
}

var androidConfig = config{
	isHostWrapper:     false,
	isAndroidWrapper:  true,
	gccRootRelPath:    "./",
	clangRootRelPath:  "./",
	commonFlags:       []string{},
	gccFlags:          []string{},
	clangFlags:        []string{},
	clangPostFlags:    []string{},
	newWarningsDir:    "",
	triciumNitsDir:    "",
	crashArtifactsDir: "",
}
