@@ -128,7 +128,7 @@ MSP430ToolChain::MSP430ToolChain(const Driver &D, const llvm::Triple &Triple,
128
128
}
129
129
130
130
SmallString<128 > SysRootDir (computeSysRoot ());
131
- llvm::sys::path::append (SysRootDir, " lib" , MultilibSuf);
131
+ llvm::sys::path::append (SysRootDir, " msp430-elf " , " lib" , MultilibSuf);
132
132
addPathIfExists (D, SysRootDir, getFilePaths ());
133
133
}
134
134
@@ -138,10 +138,9 @@ std::string MSP430ToolChain::computeSysRoot() const {
138
138
139
139
SmallString<128 > Dir;
140
140
if (GCCInstallation.isValid ())
141
- llvm::sys::path::append (Dir, GCCInstallation.getParentLibPath (), " .." ,
142
- GCCInstallation.getTriple ().str ());
141
+ llvm::sys::path::append (Dir, GCCInstallation.getParentLibPath (), " .." );
143
142
else
144
- llvm::sys::path::append (Dir, getDriver ().Dir , " .." , getTriple (). str () );
143
+ llvm::sys::path::append (Dir, getDriver ().Dir , " .." );
145
144
146
145
return std::string (Dir.str ());
147
146
}
@@ -153,7 +152,7 @@ void MSP430ToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
153
152
return ;
154
153
155
154
SmallString<128 > Dir (computeSysRoot ());
156
- llvm::sys::path::append (Dir, " include" );
155
+ llvm::sys::path::append (Dir, " msp430-elf " , " include" );
157
156
addSystemInclude (DriverArgs, CC1Args, Dir.str ());
158
157
}
159
158
@@ -180,6 +179,87 @@ Tool *MSP430ToolChain::buildLinker() const {
180
179
return new tools::msp430::Linker (*this );
181
180
}
182
181
182
+ void msp430::Linker::AddStartFiles (bool UseExceptions, const ArgList &Args,
183
+ ArgStringList &CmdArgs) const {
184
+ const ToolChain &ToolChain = getToolChain ();
185
+
186
+ CmdArgs.push_back (Args.MakeArgString (ToolChain.GetFilePath (" crt0.o" )));
187
+ const char *crtbegin = UseExceptions ? " crtbegin.o" : " crtbegin_no_eh.o" ;
188
+ CmdArgs.push_back (Args.MakeArgString (ToolChain.GetFilePath (crtbegin)));
189
+ }
190
+
191
+ void msp430::Linker::AddDefaultLibs (const llvm::opt::ArgList &Args,
192
+ llvm::opt::ArgStringList &CmdArgs) const {
193
+ const ToolChain &ToolChain = getToolChain ();
194
+ const Driver &D = ToolChain.getDriver ();
195
+
196
+ CmdArgs.push_back (" --start-group" );
197
+ CmdArgs.push_back (Args.MakeArgString (getHWMultLib (Args)));
198
+ CmdArgs.push_back (" -lc" );
199
+ AddRunTimeLibs (ToolChain, D, CmdArgs, Args);
200
+ CmdArgs.push_back (" -lcrt" );
201
+
202
+ if (Args.hasArg (options::OPT_msim)) {
203
+ CmdArgs.push_back (" -lsim" );
204
+
205
+ // msp430-sim.ld relies on __crt0_call_exit being implicitly .refsym-ed
206
+ // in main() by msp430-gcc.
207
+ // This workaround should work seamlessly unless the compilation unit that
208
+ // contains main() is compiled by clang and then passed to
209
+ // gcc compiler driver for linkage.
210
+ CmdArgs.push_back (" --undefined=__crt0_call_exit" );
211
+ } else
212
+ CmdArgs.push_back (" -lnosys" );
213
+
214
+ CmdArgs.push_back (" --end-group" );
215
+ AddRunTimeLibs (ToolChain, D, CmdArgs, Args);
216
+ }
217
+
218
+ void msp430::Linker::AddEndFiles (bool UseExceptions, const ArgList &Args,
219
+ ArgStringList &CmdArgs) const {
220
+ const ToolChain &ToolChain = getToolChain ();
221
+ const Driver &D = ToolChain.getDriver ();
222
+
223
+ const char *crtend = UseExceptions ? " crtend.o" : " crtend_no_eh.o" ;
224
+ CmdArgs.push_back (Args.MakeArgString (ToolChain.GetFilePath (crtend)));
225
+ AddRunTimeLibs (ToolChain, D, CmdArgs, Args);
226
+ }
227
+
228
+ static void AddSspArgs (const ArgList &Args, ArgStringList &CmdArgs) {
229
+ Arg *SspFlag = Args.getLastArg (
230
+ options::OPT_fno_stack_protector, options::OPT_fstack_protector,
231
+ options::OPT_fstack_protector_all, options::OPT_fstack_protector_strong);
232
+
233
+ if (SspFlag &&
234
+ !SspFlag->getOption ().matches (options::OPT_fno_stack_protector)) {
235
+ CmdArgs.push_back (" -lssp_nonshared" );
236
+ CmdArgs.push_back (" -lssp" );
237
+ }
238
+ }
239
+
240
+ static void AddImplicitLinkerScript (const std::string SysRoot,
241
+ const ArgList &Args,
242
+ ArgStringList &CmdArgs) {
243
+ if (Args.hasArg (options::OPT_T))
244
+ return ;
245
+
246
+ if (Args.hasArg (options::OPT_msim)) {
247
+ CmdArgs.push_back (" -Tmsp430-sim.ld" );
248
+ return ;
249
+ }
250
+
251
+ const Arg *MCUArg = Args.getLastArg (options::OPT_mmcu_EQ);
252
+ if (!MCUArg)
253
+ return ;
254
+
255
+ SmallString<128 > MCULinkerScriptPath (SysRoot);
256
+ llvm::sys::path::append (MCULinkerScriptPath, " include" );
257
+ // -L because <mcu>.ld INCLUDEs <mcu>_symbols.ld
258
+ CmdArgs.push_back (Args.MakeArgString (" -L" + MCULinkerScriptPath));
259
+ CmdArgs.push_back (
260
+ Args.MakeArgString (" -T" + StringRef (MCUArg->getValue ()) + " .ld" ));
261
+ }
262
+
183
263
void msp430::Linker::ConstructJob (Compilation &C, const JobAction &JA,
184
264
const InputInfo &Output,
185
265
const InputInfoList &Inputs,
@@ -189,44 +269,49 @@ void msp430::Linker::ConstructJob(Compilation &C, const JobAction &JA,
189
269
const Driver &D = ToolChain.getDriver ();
190
270
std::string Linker = ToolChain.GetProgramPath (getShortName ());
191
271
ArgStringList CmdArgs;
192
-
193
- if (!D.SysRoot .empty ())
194
- CmdArgs.push_back (Args.MakeArgString (" --sysroot=" + D.SysRoot ));
272
+ bool UseExceptions = Args.hasFlag (options::OPT_fexceptions,
273
+ options::OPT_fno_exceptions, false );
274
+ bool UseStartAndEndFiles = !Args.hasArg (options::OPT_nostdlib, options::OPT_r,
275
+ options::OPT_nostartfiles);
276
+
277
+ if (Args.hasArg (options::OPT_mrelax))
278
+ CmdArgs.push_back (" --relax" );
279
+ if (!Args.hasArg (options::OPT_r, options::OPT_g_Group))
280
+ CmdArgs.push_back (" --gc-sections" );
281
+
282
+ Args.AddAllArgs (CmdArgs, {
283
+ options::OPT_e,
284
+ options::OPT_n,
285
+ options::OPT_s,
286
+ options::OPT_t,
287
+ options::OPT_u,
288
+ });
289
+
290
+ if (UseStartAndEndFiles)
291
+ AddStartFiles (UseExceptions, Args, CmdArgs);
195
292
196
293
Args.AddAllArgs (CmdArgs, options::OPT_L);
197
294
ToolChain.AddFilePathLibArgs (Args, CmdArgs);
198
-
199
- if (!Args.hasArg (options::OPT_T)) {
200
- if (const Arg *MCUArg = Args.getLastArg (options::OPT_mmcu_EQ))
201
- CmdArgs.push_back (
202
- Args.MakeArgString (" -T" + StringRef (MCUArg->getValue ()) + " .ld" ));
203
- } else {
204
- Args.AddAllArgs (CmdArgs, options::OPT_T);
205
- }
206
-
207
- if (!Args.hasArg (options::OPT_nostdlib, options::OPT_nostartfiles)) {
208
- CmdArgs.push_back (Args.MakeArgString (ToolChain.GetFilePath (" crt0.o" )));
209
- CmdArgs.push_back (Args.MakeArgString (ToolChain.GetFilePath (" crtbegin.o" )));
210
- }
211
-
212
295
AddLinkerInputs (getToolChain (), Inputs, Args, CmdArgs, JA);
213
296
214
- CmdArgs.push_back (" --start-group" );
215
- CmdArgs.push_back (Args.MakeArgString (getHWMultLib (Args)));
216
- CmdArgs.push_back (" -lgcc" );
217
- if (!Args.hasArg (options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
218
- CmdArgs.push_back (" -lc" );
219
- CmdArgs.push_back (" -lcrt" );
220
- CmdArgs.push_back (" -lnosys" );
297
+ if (!Args.hasArg (options::OPT_nostdlib, options::OPT_r,
298
+ options::OPT_nodefaultlibs)) {
299
+ AddSspArgs (Args, CmdArgs);
300
+ AddRunTimeLibs (ToolChain, D, CmdArgs, Args);
301
+ if (!Args.hasArg (options::OPT_nolibc)) {
302
+ AddDefaultLibs (Args, CmdArgs);
303
+ AddImplicitLinkerScript (D.SysRoot , Args, CmdArgs);
304
+ }
221
305
}
222
- CmdArgs.push_back (" --end-group" );
223
306
224
- if (!Args.hasArg (options::OPT_nostdlib, options::OPT_nostartfiles)) {
225
- CmdArgs.push_back (Args.MakeArgString (ToolChain.GetFilePath (" crtend.o" )));
226
- CmdArgs.push_back (Args.MakeArgString (ToolChain.GetFilePath (" crtn.o" )));
227
- }
307
+ if (UseStartAndEndFiles)
308
+ AddEndFiles (UseExceptions, Args, CmdArgs);
309
+
228
310
CmdArgs.push_back (" -o" );
229
311
CmdArgs.push_back (Output.getFilename ());
312
+
313
+ Args.AddAllArgs (CmdArgs, options::OPT_T);
314
+
230
315
C.addCommand (
231
316
std::make_unique<Command>(JA, *this , ResponseFileSupport::AtFileCurCP (),
232
317
Args.MakeArgString (Linker), CmdArgs, Inputs));
0 commit comments