Coverage Report

Created: 2020-09-22 08:39

/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/lib/Driver/ToolChains/DragonFly.cpp
Line
Count
Source (jump to first uncovered line)
1
//===--- DragonFly.cpp - DragonFly ToolChain Implementations ----*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#include "DragonFly.h"
10
#include "CommonArgs.h"
11
#include "clang/Driver/Compilation.h"
12
#include "clang/Driver/Driver.h"
13
#include "clang/Driver/Options.h"
14
#include "llvm/Option/ArgList.h"
15
16
using namespace clang::driver;
17
using namespace clang::driver::tools;
18
using namespace clang::driver::toolchains;
19
using namespace clang;
20
using namespace llvm::opt;
21
22
/// DragonFly Tools
23
24
// For now, DragonFly Assemble does just about the same as for
25
// FreeBSD, but this may change soon.
26
void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
27
                                        const InputInfo &Output,
28
                                        const InputInfoList &Inputs,
29
                                        const ArgList &Args,
30
0
                                        const char *LinkingOutput) const {
31
0
  claimNoWarnArgs(Args);
32
0
  ArgStringList CmdArgs;
33
34
  // When building 32-bit code on DragonFly/pc64, we have to explicitly
35
  // instruct as in the base system to assemble 32-bit code.
36
0
  if (getToolChain().getArch() == llvm::Triple::x86)
37
0
    CmdArgs.push_back("--32");
38
39
0
  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
40
41
0
  CmdArgs.push_back("-o");
42
0
  CmdArgs.push_back(Output.getFilename());
43
44
0
  for (const auto &II : Inputs)
45
0
    CmdArgs.push_back(II.getFilename());
46
47
0
  const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
48
0
  C.addCommand(std::make_unique<Command>(
49
0
      JA, *this, ResponseFileSupport::AtFileCurCP(), Exec, CmdArgs, Inputs));
50
0
}
51
52
void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
53
                                     const InputInfo &Output,
54
                                     const InputInfoList &Inputs,
55
                                     const ArgList &Args,
56
1
                                     const char *LinkingOutput) const {
57
1
  const Driver &D = getToolChain().getDriver();
58
1
  ArgStringList CmdArgs;
59
60
1
  if (!D.SysRoot.empty())
61
0
    CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
62
63
1
  CmdArgs.push_back("--eh-frame-hdr");
64
1
  if (Args.hasArg(options::OPT_static)) {
65
0
    CmdArgs.push_back("-Bstatic");
66
1
  } else {
67
1
    if (Args.hasArg(options::OPT_rdynamic))
68
0
      CmdArgs.push_back("-export-dynamic");
69
1
    if (Args.hasArg(options::OPT_shared))
70
0
      CmdArgs.push_back("-Bshareable");
71
1
    else {
72
1
      CmdArgs.push_back("-dynamic-linker");
73
1
      CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
74
1
    }
75
1
    CmdArgs.push_back("--hash-style=gnu");
76
1
    CmdArgs.push_back("--enable-new-dtags");
77
1
  }
78
79
  // When building 32-bit code on DragonFly/pc64, we have to explicitly
80
  // instruct ld in the base system to link 32-bit code.
81
1
  if (getToolChain().getArch() == llvm::Triple::x86) {
82
0
    CmdArgs.push_back("-m");
83
0
    CmdArgs.push_back("elf_i386");
84
0
  }
85
86
1
  if (Output.isFilename()) {
87
1
    CmdArgs.push_back("-o");
88
1
    CmdArgs.push_back(Output.getFilename());
89
0
  } else {
90
0
    assert(Output.isNothing() && "Invalid output.");
91
0
  }
92
93
1
  if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
94
1
    if (!Args.hasArg(options::OPT_shared)) {
95
1
      if (Args.hasArg(options::OPT_pg))
96
0
        CmdArgs.push_back(
97
0
            Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
98
1
      else {
99
1
        if (Args.hasArg(options::OPT_pie))
100
0
          CmdArgs.push_back(
101
0
              Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
102
1
        else
103
1
          CmdArgs.push_back(
104
1
              Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
105
1
      }
106
1
    }
107
1
    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
108
1
    if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
109
0
      CmdArgs.push_back(
110
0
          Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
111
1
    else
112
1
      CmdArgs.push_back(
113
1
          Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
114
1
  }
115
116
1
  Args.AddAllArgs(CmdArgs,
117
1
                  {options::OPT_L, options::OPT_T_Group, options::OPT_e});
118
119
1
  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA);
120
121
1
  if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
122
1
    CmdArgs.push_back("-L/usr/lib/gcc50");
123
124
1
    if (!Args.hasArg(options::OPT_static)) {
125
1
      CmdArgs.push_back("-rpath");
126
1
      CmdArgs.push_back("/usr/lib/gcc50");
127
1
    }
128
129
1
    if (D.CCCIsCXX()) {
130
0
      if (getToolChain().ShouldLinkCXXStdlib(Args))
131
0
        getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
132
0
      CmdArgs.push_back("-lm");
133
0
    }
134
135
1
    if (Args.hasArg(options::OPT_pthread))
136
0
      CmdArgs.push_back("-lpthread");
137
138
1
    if (!Args.hasArg(options::OPT_nolibc)) {
139
1
      CmdArgs.push_back("-lc");
140
1
    }
141
142
1
    if (Args.hasArg(options::OPT_static) ||
143
1
        Args.hasArg(options::OPT_static_libgcc)) {
144
0
        CmdArgs.push_back("-lgcc");
145
0
        CmdArgs.push_back("-lgcc_eh");
146
1
    } else {
147
1
      if (Args.hasArg(options::OPT_shared_libgcc)) {
148
0
          CmdArgs.push_back("-lgcc_pic");
149
0
          if (!Args.hasArg(options::OPT_shared))
150
0
            CmdArgs.push_back("-lgcc");
151
1
      } else {
152
1
          CmdArgs.push_back("-lgcc");
153
1
          CmdArgs.push_back("--as-needed");
154
1
          CmdArgs.push_back("-lgcc_pic");
155
1
          CmdArgs.push_back("--no-as-needed");
156
1
      }
157
1
    }
158
1
  }
159
160
1
  if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
161
1
    if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
162
0
      CmdArgs.push_back(
163
0
          Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
164
1
    else
165
1
      CmdArgs.push_back(
166
1
          Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
167
1
    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
168
1
  }
169
170
1
  getToolChain().addProfileRTLibs(Args, CmdArgs);
171
172
1
  const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
173
1
  C.addCommand(std::make_unique<Command>(
174
1
      JA, *this, ResponseFileSupport::AtFileCurCP(), Exec, CmdArgs, Inputs));
175
1
}
176
177
/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
178
179
DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
180
                     const ArgList &Args)
181
2
    : Generic_ELF(D, Triple, Args) {
182
183
  // Path mangling to find libexec
184
2
  getProgramPaths().push_back(getDriver().getInstalledDir());
185
2
  if (getDriver().getInstalledDir() != getDriver().Dir)
186
0
    getProgramPaths().push_back(getDriver().Dir);
187
188
2
  getFilePaths().push_back(getDriver().Dir + "/../lib");
189
2
  getFilePaths().push_back("/usr/lib");
190
2
  getFilePaths().push_back("/usr/lib/gcc50");
191
2
}
192
193
0
Tool *DragonFly::buildAssembler() const {
194
0
  return new tools::dragonfly::Assembler(*this);
195
0
}
196
197
1
Tool *DragonFly::buildLinker() const {
198
1
  return new tools::dragonfly::Linker(*this);
199
1
}