aboutsummaryrefslogtreecommitdiff
path: root/compiler_wrapper/compiler_wrapper.go
diff options
context:
space:
mode:
Diffstat (limited to 'compiler_wrapper/compiler_wrapper.go')
-rw-r--r--compiler_wrapper/compiler_wrapper.go266
1 files changed, 0 insertions, 266 deletions
diff --git a/compiler_wrapper/compiler_wrapper.go b/compiler_wrapper/compiler_wrapper.go
deleted file mode 100644
index 17c62db7..00000000
--- a/compiler_wrapper/compiler_wrapper.go
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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 (
- "bytes"
- "fmt"
- "io"
- "path/filepath"
- "strings"
-)
-
-func callCompiler(env env, cfg *config, inputCmd *command) int {
- var compilerErr error
-
- if !filepath.IsAbs(inputCmd.Path) && !strings.HasPrefix(inputCmd.Path, ".") &&
- !strings.ContainsRune(inputCmd.Path, filepath.Separator) {
- if resolvedPath, err := resolveAgainstPathEnv(env, inputCmd.Path); err == nil {
- inputCmd = &command{
- Path: resolvedPath,
- Args: inputCmd.Args,
- EnvUpdates: inputCmd.EnvUpdates,
- }
- } else {
- compilerErr = err
- }
- }
- exitCode := 0
- if compilerErr == nil {
- if cfg.oldWrapperPath != "" {
- exitCode, compilerErr = callCompilerWithRunAndCompareToOldWrapper(env, cfg, inputCmd)
- } else {
- exitCode, compilerErr = callCompilerInternal(env, cfg, inputCmd)
- }
- }
- if compilerErr != nil {
- printCompilerError(env.stderr(), compilerErr)
- exitCode = 1
- }
- return exitCode
-}
-
-func callCompilerWithRunAndCompareToOldWrapper(env env, cfg *config, inputCmd *command) (exitCode int, err error) {
- stdinBuffer := &bytes.Buffer{}
- recordingEnv := &commandRecordingEnv{
- env: env,
- stdinReader: teeStdinIfNeeded(env, inputCmd, stdinBuffer),
- }
- // Note: this won't do a real exec as recordingEnv redirects exec to run.
- if exitCode, err = callCompilerInternal(recordingEnv, cfg, inputCmd); err != nil {
- return 0, err
- }
- if err = compareToOldWrapper(env, cfg, inputCmd, stdinBuffer.Bytes(), recordingEnv.cmdResults, exitCode); err != nil {
- return exitCode, err
- }
- return exitCode, nil
-}
-
-func callCompilerInternal(env env, cfg *config, inputCmd *command) (exitCode int, err error) {
- if err := checkUnsupportedFlags(inputCmd); err != nil {
- return 0, err
- }
- mainBuilder, err := newCommandBuilder(env, cfg, inputCmd)
- if err != nil {
- return 0, err
- }
- processPrintConfigFlag(mainBuilder)
- processPrintCmdlineFlag(mainBuilder)
- env = mainBuilder.env
- var compilerCmd *command
- clangSyntax := processClangSyntaxFlag(mainBuilder)
- if cfg.isAndroidWrapper {
- // FIXME: This combination of using the directory of the symlink but the
- // basename of the link target is strange but is the logic that old android
- // wrapper uses. Change this to use directory and basename either from the
- // absWrapperPath or from the builder.path, but don't mix anymore.
- mainBuilder.path = filepath.Join(filepath.Dir(mainBuilder.path), filepath.Base(mainBuilder.absWrapperPath)+".real")
-
- switch mainBuilder.target.compilerType {
- case clangType:
- mainBuilder.addPreUserArgs(mainBuilder.cfg.clangFlags...)
- mainBuilder.addPreUserArgs(mainBuilder.cfg.commonFlags...)
- if _, err := processGomaCccFlags(mainBuilder); err != nil {
- return 0, err
- }
- compilerCmd = mainBuilder.build()
- case clangTidyType:
- compilerCmd = mainBuilder.build()
- default:
- return 0, newErrorwithSourceLocf("unsupported compiler: %s", mainBuilder.target.compiler)
- }
- } else if mainBuilder.target.compilerType == clangType {
- cSrcFile, useClangTidy := processClangTidyFlags(mainBuilder)
- sysroot, err := prepareClangCommand(mainBuilder)
- if err != nil {
- return 0, err
- }
- allowCCache := true
- if useClangTidy {
- allowCCache = false
- clangCmdWithoutGomaAndCCache := mainBuilder.build()
- if err := runClangTidy(env, clangCmdWithoutGomaAndCCache, cSrcFile); err != nil {
- return 0, err
- }
- }
- if err := processGomaCCacheFlags(sysroot, allowCCache, mainBuilder); err != nil {
- return 0, err
- }
- compilerCmd = mainBuilder.build()
- } else {
- if clangSyntax {
- allowCCache := false
- clangCmd, err := calcClangCommand(allowCCache, mainBuilder.clone())
- if err != nil {
- return 0, err
- }
- gccCmd, err := calcGccCommand(mainBuilder)
- if err != nil {
- return 0, err
- }
- return checkClangSyntax(env, clangCmd, gccCmd)
- }
- compilerCmd, err = calcGccCommand(mainBuilder)
- if err != nil {
- return 0, err
- }
- }
- rusageLogfileName := getRusageLogFilename(env)
- bisectStage := getBisectStage(env)
- if shouldForceDisableWError(env) {
- if rusageLogfileName != "" {
- return 0, newUserErrorf("GETRUSAGE is meaningless with FORCE_DISABLE_WERROR")
- }
- if bisectStage != "" {
- return 0, newUserErrorf("BISECT_STAGE is meaningless with FORCE_DISABLE_WERROR")
- }
- return doubleBuildWithWNoError(env, cfg, compilerCmd)
- }
- if shouldCompileWithFallback(env) {
- if rusageLogfileName != "" {
- return 0, newUserErrorf("GETRUSAGE is meaningless with FORCE_DISABLE_WERROR")
- }
- if bisectStage != "" {
- return 0, newUserErrorf("BISECT_STAGE is meaningless with FORCE_DISABLE_WERROR")
- }
- return compileWithFallback(env, cfg, compilerCmd, mainBuilder.absWrapperPath)
- }
- if rusageLogfileName != "" {
- if bisectStage != "" {
- return 0, newUserErrorf("BISECT_STAGE is meaningless with GETRUSAGE")
- }
- return logRusage(env, rusageLogfileName, compilerCmd)
- }
- if bisectStage != "" {
- compilerCmd, err = calcBisectCommand(env, cfg, bisectStage, compilerCmd)
- if err != nil {
- return 0, err
- }
- }
- // Note: We return an exit code only if the underlying env is not
- // really doing an exec, e.g. commandRecordingEnv.
- return wrapSubprocessErrorWithSourceLoc(compilerCmd, env.exec(compilerCmd))
-}
-
-func prepareClangCommand(builder *commandBuilder) (sysroot string, err error) {
- sysroot = ""
- if !builder.cfg.isHostWrapper {
- sysroot = processSysrootFlag(builder)
- }
- builder.addPreUserArgs(builder.cfg.clangFlags...)
- calcCommonPreUserArgs(builder)
- if err := processClangFlags(builder); err != nil {
- return "", err
- }
- return sysroot, nil
-}
-
-func calcClangCommand(allowCCache bool, builder *commandBuilder) (*command, error) {
- sysroot, err := prepareClangCommand(builder)
- if err != nil {
- return nil, err
- }
- if err := processGomaCCacheFlags(sysroot, allowCCache, builder); err != nil {
- return nil, err
- }
- return builder.build(), nil
-}
-
-func calcGccCommand(builder *commandBuilder) (*command, error) {
- sysroot := ""
- if !builder.cfg.isHostWrapper {
- sysroot = processSysrootFlag(builder)
- }
- builder.addPreUserArgs(builder.cfg.gccFlags...)
- if !builder.cfg.isHostWrapper {
- calcCommonPreUserArgs(builder)
- }
- processGccFlags(builder)
- if !builder.cfg.isHostWrapper {
- allowCCache := true
- if err := processGomaCCacheFlags(sysroot, allowCCache, builder); err != nil {
- return nil, err
- }
- }
- return builder.build(), nil
-}
-
-func calcCommonPreUserArgs(builder *commandBuilder) {
- builder.addPreUserArgs(builder.cfg.commonFlags...)
- if !builder.cfg.isHostWrapper {
- processPieFlags(builder)
- processThumbCodeFlags(builder)
- processStackProtectorFlags(builder)
- processX86Flags(builder)
- }
- processSanitizerFlags(builder)
-}
-
-func processGomaCCacheFlags(sysroot string, allowCCache bool, builder *commandBuilder) (err error) {
- gomaccUsed := false
- if !builder.cfg.isHostWrapper {
- gomaccUsed, err = processGomaCccFlags(builder)
- if err != nil {
- return err
- }
- }
- if !gomaccUsed && allowCCache {
- processCCacheFlag(sysroot, builder)
- }
- return nil
-}
-
-func getAbsWrapperPath(env env, wrapperCmd *command) (string, error) {
- wrapperPath := getAbsCmdPath(env, wrapperCmd)
- evaledCmdPath, err := filepath.EvalSymlinks(wrapperPath)
- if err != nil {
- return "", wrapErrorwithSourceLocf(err, "failed to evaluate symlinks for %s", wrapperPath)
- }
- return evaledCmdPath, nil
-}
-
-func printCompilerError(writer io.Writer, compilerErr error) {
- if _, ok := compilerErr.(userError); ok {
- fmt.Fprintf(writer, "%s\n", compilerErr)
- } else {
- fmt.Fprintf(writer,
- "Internal error. Please report to chromeos-toolchain@google.com.\n%s\n",
- compilerErr)
- }
-}
-
-func teeStdinIfNeeded(env env, inputCmd *command, dest io.Writer) io.Reader {
- // We can't use io.TeeReader unconditionally, as that would block
- // calls to exec.Cmd.Run(), even if the underlying process has already
- // terminated. See https://github.com/golang/go/issues/7990 for more details.
- lastArg := ""
- for _, arg := range inputCmd.Args {
- if arg == "-" && lastArg != "-o" {
- return io.TeeReader(env.stdin(), dest)
- }
- lastArg = arg
- }
- return env.stdin()
-}