1 | |
2 | |
3 | |
4 | |
5 | |
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 | |
23 | |
24 | |
25 | |
26 | void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA, |
27 | const InputInfo &Output, |
28 | const InputInfoList &Inputs, |
29 | const ArgList &Args, |
30 | const char *LinkingOutput) const { |
31 | claimNoWarnArgs(Args); |
32 | ArgStringList CmdArgs; |
33 | |
34 | |
35 | |
36 | if (getToolChain().getArch() == llvm::Triple::x86) |
37 | CmdArgs.push_back("--32"); |
38 | |
39 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); |
40 | |
41 | CmdArgs.push_back("-o"); |
42 | CmdArgs.push_back(Output.getFilename()); |
43 | |
44 | for (const auto &II : Inputs) |
45 | CmdArgs.push_back(II.getFilename()); |
46 | |
47 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); |
48 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); |
49 | } |
50 | |
51 | void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA, |
52 | const InputInfo &Output, |
53 | const InputInfoList &Inputs, |
54 | const ArgList &Args, |
55 | const char *LinkingOutput) const { |
56 | const Driver &D = getToolChain().getDriver(); |
57 | ArgStringList CmdArgs; |
58 | |
59 | if (!D.SysRoot.empty()) |
60 | CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); |
61 | |
62 | CmdArgs.push_back("--eh-frame-hdr"); |
63 | if (Args.hasArg(options::OPT_static)) { |
64 | CmdArgs.push_back("-Bstatic"); |
65 | } else { |
66 | if (Args.hasArg(options::OPT_rdynamic)) |
67 | CmdArgs.push_back("-export-dynamic"); |
68 | if (Args.hasArg(options::OPT_shared)) |
69 | CmdArgs.push_back("-Bshareable"); |
70 | else { |
71 | CmdArgs.push_back("-dynamic-linker"); |
72 | CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); |
73 | } |
74 | CmdArgs.push_back("--hash-style=gnu"); |
75 | CmdArgs.push_back("--enable-new-dtags"); |
76 | } |
77 | |
78 | |
79 | |
80 | if (getToolChain().getArch() == llvm::Triple::x86) { |
81 | CmdArgs.push_back("-m"); |
82 | CmdArgs.push_back("elf_i386"); |
83 | } |
84 | |
85 | if (Output.isFilename()) { |
86 | CmdArgs.push_back("-o"); |
87 | CmdArgs.push_back(Output.getFilename()); |
88 | } else { |
89 | (0) . __assert_fail ("Output.isNothing() && \"Invalid output.\"", "/home/seafit/code_projects/clang_source/clang/lib/Driver/ToolChains/DragonFly.cpp", 89, __PRETTY_FUNCTION__))" file_link="../../../../include/assert.h.html#88" macro="true">assert(Output.isNothing() && "Invalid output."); |
90 | } |
91 | |
92 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { |
93 | if (!Args.hasArg(options::OPT_shared)) { |
94 | if (Args.hasArg(options::OPT_pg)) |
95 | CmdArgs.push_back( |
96 | Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o"))); |
97 | else { |
98 | if (Args.hasArg(options::OPT_pie)) |
99 | CmdArgs.push_back( |
100 | Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o"))); |
101 | else |
102 | CmdArgs.push_back( |
103 | Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); |
104 | } |
105 | } |
106 | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); |
107 | if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) |
108 | CmdArgs.push_back( |
109 | Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); |
110 | else |
111 | CmdArgs.push_back( |
112 | Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); |
113 | } |
114 | |
115 | Args.AddAllArgs(CmdArgs, |
116 | {options::OPT_L, options::OPT_T_Group, options::OPT_e}); |
117 | |
118 | AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA); |
119 | |
120 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { |
121 | CmdArgs.push_back("-L/usr/lib/gcc50"); |
122 | |
123 | if (!Args.hasArg(options::OPT_static)) { |
124 | CmdArgs.push_back("-rpath"); |
125 | CmdArgs.push_back("/usr/lib/gcc50"); |
126 | } |
127 | |
128 | if (D.CCCIsCXX()) { |
129 | if (getToolChain().ShouldLinkCXXStdlib(Args)) |
130 | getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); |
131 | CmdArgs.push_back("-lm"); |
132 | } |
133 | |
134 | if (Args.hasArg(options::OPT_pthread)) |
135 | CmdArgs.push_back("-lpthread"); |
136 | |
137 | if (!Args.hasArg(options::OPT_nolibc)) { |
138 | CmdArgs.push_back("-lc"); |
139 | } |
140 | |
141 | if (Args.hasArg(options::OPT_static) || |
142 | Args.hasArg(options::OPT_static_libgcc)) { |
143 | CmdArgs.push_back("-lgcc"); |
144 | CmdArgs.push_back("-lgcc_eh"); |
145 | } else { |
146 | if (Args.hasArg(options::OPT_shared_libgcc)) { |
147 | CmdArgs.push_back("-lgcc_pic"); |
148 | if (!Args.hasArg(options::OPT_shared)) |
149 | CmdArgs.push_back("-lgcc"); |
150 | } else { |
151 | CmdArgs.push_back("-lgcc"); |
152 | CmdArgs.push_back("--as-needed"); |
153 | CmdArgs.push_back("-lgcc_pic"); |
154 | CmdArgs.push_back("--no-as-needed"); |
155 | } |
156 | } |
157 | } |
158 | |
159 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { |
160 | if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) |
161 | CmdArgs.push_back( |
162 | Args.MakeArgString(getToolChain().GetFilePath("crtendS.o"))); |
163 | else |
164 | CmdArgs.push_back( |
165 | Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); |
166 | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); |
167 | } |
168 | |
169 | getToolChain().addProfileRTLibs(Args, CmdArgs); |
170 | |
171 | const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); |
172 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); |
173 | } |
174 | |
175 | |
176 | |
177 | DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple, |
178 | const ArgList &Args) |
179 | : Generic_ELF(D, Triple, Args) { |
180 | |
181 | |
182 | getProgramPaths().push_back(getDriver().getInstalledDir()); |
183 | if (getDriver().getInstalledDir() != getDriver().Dir) |
184 | getProgramPaths().push_back(getDriver().Dir); |
185 | |
186 | getFilePaths().push_back(getDriver().Dir + "/../lib"); |
187 | getFilePaths().push_back("/usr/lib"); |
188 | getFilePaths().push_back("/usr/lib/gcc50"); |
189 | } |
190 | |
191 | Tool *DragonFly::buildAssembler() const { |
192 | return new tools::dragonfly::Assembler(*this); |
193 | } |
194 | |
195 | Tool *DragonFly::buildLinker() const { |
196 | return new tools::dragonfly::Linker(*this); |
197 | } |
198 | |