blob: 835bb59c9b8d6799665a9524fd6e099b20dedf71 [file] [log] [blame]
Shih-wei Liao5460a1f2012-03-16 22:41:16 -07001//===- llvm-mcld.cpp ------------------------------------------------------===//
2//
3// The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include <mcld/Target/TargetMachine.h>
10#include <mcld/Support/TargetSelect.h>
11#include <mcld/Support/TargetRegistry.h>
12#include <mcld/Support/CommandLine.h>
13#include <mcld/Support/DerivedPositionDependentOptions.h>
14#include <mcld/Support/RealPath.h>
15#include <mcld/CodeGen/SectLinkerOption.h>
16
17#include <llvm/Module.h>
18#include <llvm/PassManager.h>
19#include <llvm/Pass.h>
20#include <llvm/ADT/Triple.h>
21#include <llvm/LLVMContext.h>
22#include <llvm/MC/SubtargetFeature.h>
23#include <llvm/Support/CommandLine.h>
24#include <llvm/Support/Debug.h>
25#include <llvm/Support/FormattedStream.h>
26#include <llvm/Support/Host.h>
27#include <llvm/Support/IRReader.h>
28#include <llvm/Support/ManagedStatic.h>
29#include <llvm/Support/TargetRegistry.h>
30#include <llvm/Support/TargetSelect.h>
31#include <llvm/Support/ToolOutputFile.h>
32#include <llvm/Target/TargetData.h>
33#include <llvm/Target/TargetMachine.h>
34
35using namespace llvm;
36
37#ifdef ENABLE_UNITTEST
38#include <gtest.h>
39
40static cl::opt<bool>
41UnitTest("unittest", cl::desc("do unit test") );
42
43int unit_test( int argc, char* argv[] )
44{
45 testing::InitGoogleTest( &argc, argv );
46 return RUN_ALL_TESTS();
47}
48
49#endif
50
51
52// General options for llc. Other pass-specific options are specified
53// within the corresponding llc passes, and target-specific options
54// and back-end code generation options are specified with the target machine.
55//
56static cl::opt<std::string>
57InputFilename("dB",
58 cl::desc("set default bitcode"),
59 cl::value_desc("bitcode"));
60
61static cl::opt<std::string>
62OutputFilename("o",
63 cl::desc("Output filename"),
64 cl::value_desc("filename"));
65
66// Determine optimization level.
67static cl::opt<char>
68OptLevel("O",
69 cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
70 "(default = '-O2')"),
71 cl::Prefix,
72 cl::ZeroOrMore,
73 cl::init(' '));
74
75static cl::opt<std::string>
76TargetTriple("mtriple", cl::desc("Override target triple for module"));
77
78static cl::opt<std::string>
79MArch("march", cl::desc("Architecture to generate code for (see --version)"));
80
81static cl::opt<std::string>
82MCPU("mcpu",
83 cl::desc("Target a specific cpu type (-mcpu=help for details)"),
84 cl::value_desc("cpu-name"),
85 cl::init(""));
86
87static cl::list<std::string>
88MAttrs("mattr",
89 cl::CommaSeparated,
90 cl::desc("Target specific attributes (-mattr=help for details)"),
91 cl::value_desc("a1,+a2,-a3,..."));
92
93static cl::opt<Reloc::Model>
94RelocModel("relocation-model",
95 cl::desc("Choose relocation model"),
96 cl::init(Reloc::Default),
97 cl::values(
98 clEnumValN(Reloc::Default, "default",
99 "Target default relocation model"),
100 clEnumValN(Reloc::Static, "static",
101 "Non-relocatable code"),
102 clEnumValN(Reloc::PIC_, "pic",
103 "Fully relocatable, position independent code"),
104 clEnumValN(Reloc::DynamicNoPIC, "dynamic-no-pic",
105 "Relocatable external references, non-relocatable code"),
106 clEnumValEnd));
107
108static cl::opt<llvm::CodeModel::Model>
109CMModel("code-model",
110 cl::desc("Choose code model"),
111 cl::init(CodeModel::Default),
112 cl::values(clEnumValN(CodeModel::Default, "default",
113 "Target default code model"),
114 clEnumValN(CodeModel::Small, "small",
115 "Small code model"),
116 clEnumValN(CodeModel::Kernel, "kernel",
117 "Kernel code model"),
118 clEnumValN(CodeModel::Medium, "medium",
119 "Medium code model"),
120 clEnumValN(CodeModel::Large, "large",
121 "Large code model"),
122 clEnumValEnd));
123
124cl::opt<mcld::CodeGenFileType>
125FileType("filetype", cl::init(mcld::CGFT_EXEFile),
126 cl::desc("Choose a file type (not all types are supported by all targets):"),
127 cl::values(
128 clEnumValN(mcld::CGFT_ASMFile, "asm",
129 "Emit an assembly ('.s') file"),
130 clEnumValN(mcld::CGFT_OBJFile, "obj",
131 "Emit a relocatable object ('.o') file"),
132 clEnumValN(mcld::CGFT_ARCFile, "arc",
133 "Emit an archive ('.a') file"),
134 clEnumValN(mcld::CGFT_DSOFile, "dso",
135 "Emit an dynamic shared object ('.so') file"),
136 clEnumValN(mcld::CGFT_EXEFile, "exe",
137 "Emit a executable ('.exe') file"),
138 clEnumValN(mcld::CGFT_NULLFile, "null",
139 "Emit nothing, for performance testing"),
140 clEnumValEnd));
141
142cl::opt<bool> NoVerify("disable-verify", cl::Hidden,
143 cl::desc("Do not verify input module"));
144
145static cl::opt<bool>
146EnableFPMAD("enable-fp-mad",
147 cl::desc("Enable less precise MAD instructions to be generated"),
148 cl::init(false));
149
150static cl::opt<bool>
151PrintCode("print-machineinstrs",
152 cl::desc("Print generated machine code"),
153 cl::init(false));
154
155static cl::opt<bool>
156DisableFPElim("disable-fp-elim",
157 cl::desc("Disable frame pointer elimination optimization"),
158 cl::init(false));
159
160static cl::opt<bool>
161DisableFPElimNonLeaf("disable-non-leaf-fp-elim",
162 cl::desc("Disable frame pointer elimination optimization for non-leaf funcs"),
163 cl::init(false));
164
165static cl::opt<bool>
166DisableExcessPrecision("disable-excess-fp-precision",
167 cl::desc("Disable optimizations that may increase FP precision"),
168 cl::init(false));
169
170static cl::opt<bool>
171EnableUnsafeFPMath("enable-unsafe-fp-math",
172 cl::desc("Enable optimizations that may decrease FP precision"),
173 cl::init(false));
174
175static cl::opt<bool>
176EnableNoInfsFPMath("enable-no-infs-fp-math",
177 cl::desc("Enable FP math optimizations that assume no +-Infs"),
178 cl::init(false));
179
180static cl::opt<bool>
181EnableNoNaNsFPMath("enable-no-nans-fp-math",
182 cl::desc("Enable FP math optimizations that assume no NaNs"),
183 cl::init(false));
184
185static cl::opt<bool>
186EnableHonorSignDependentRoundingFPMath("enable-sign-dependent-rounding-fp-math",
187 cl::Hidden,
188 cl::desc("Force codegen to assume rounding mode can change dynamically"),
189 cl::init(false));
190
191static cl::opt<bool>
192GenerateSoftFloatCalls("soft-float",
193 cl::desc("Generate software floating point library calls"),
194 cl::init(false));
195
196static cl::opt<llvm::FloatABI::ABIType>
197FloatABIForCalls("float-abi",
198 cl::desc("Choose float ABI type"),
199 cl::init(FloatABI::Default),
200 cl::values(
201 clEnumValN(FloatABI::Default, "default",
202 "Target default float ABI type"),
203 clEnumValN(FloatABI::Soft, "soft",
204 "Soft float ABI (implied by -soft-float)"),
205 clEnumValN(FloatABI::Hard, "hard",
206 "Hard float ABI (uses FP registers)"),
207 clEnumValEnd));
208
209static cl::opt<bool>
210DontPlaceZerosInBSS("nozero-initialized-in-bss",
211 cl::desc("Don't place zero-initialized symbols into bss section"),
212 cl::init(false));
213
214static cl::opt<bool>
215EnableJITExceptionHandling("jit-enable-eh",
216 cl::desc("Emit exception handling information"),
217 cl::init(false));
218
219// In debug builds, make this default to true.
220#ifdef NDEBUG
221#define EMIT_DEBUG false
222#else
223#define EMIT_DEBUG true
224#endif
225static cl::opt<bool>
226EmitJitDebugInfo("jit-emit-debug",
227 cl::desc("Emit debug information to debugger"),
228 cl::init(EMIT_DEBUG));
229#undef EMIT_DEBUG
230
231static cl::opt<bool>
232EmitJitDebugInfoToDisk("jit-emit-debug-to-disk",
233 cl::Hidden,
234 cl::desc("Emit debug info objfiles to disk"),
235 cl::init(false));
236
237static cl::opt<bool>
238EnableGuaranteedTailCallOpt("tailcallopt",
239 cl::desc("Turn fastcc calls into tail calls by (potentially) changing ABI."),
240 cl::init(false));
241
242static cl::opt<unsigned>
243OverrideStackAlignment("stack-alignment",
244 cl::desc("Override default stack alignment"),
245 cl::init(0));
246
247static cl::opt<bool>
248EnableRealignStack("realign-stack",
249 cl::desc("Realign stack if needed"),
250 cl::init(true));
251
252static cl::opt<bool>
253DisableSwitchTables(cl::Hidden, "disable-jump-tables",
254 cl::desc("Do not generate jump tables."),
255 cl::init(false));
256
257static cl::opt<std::string>
258TrapFuncName("trap-func", cl::Hidden,
259 cl::desc("Emit a call to trap function rather than a trap instruction"),
260 cl::init(""));
261
262static cl::opt<bool>
263SegmentedStacks("segmented-stacks",
264 cl::desc("Use segmented stacks if possible."),
265 cl::init(false));
266
267//===----------------------------------------------------------------------===//
268// Command Line Options
269// There are four kinds of command line options:
270// 1. input, (may be a file, such as -m and /tmp/XXXX.o.)
271// 2. attribute of inputs, (describing the attributes of inputs, such as
272// --as-needed and --whole-archive. usually be positional.)
273// 3. scripting options, (represent a subset of link scripting language, such
274// as --defsym.)
275// 4. and general options. (the rest of options)
276//===----------------------------------------------------------------------===//
277// General Options
278static cl::opt<mcld::sys::fs::Path, false, llvm::cl::parser<mcld::sys::fs::Path> >
279ArgSysRoot("sysroot",
280 cl::desc("Use directory as the location of the sysroot, overriding the configure-time default."),
281 cl::value_desc("directory"),
282 cl::ValueRequired);
283
284static cl::list<mcld::MCLDDirectory, bool, llvm::cl::parser<mcld::MCLDDirectory> >
285ArgSearchDirList("L",
286 cl::ZeroOrMore,
287 cl::desc("Add path searchdir to the list of paths that ld will search for archive libraries and ld control scripts."),
288 cl::value_desc("searchdir"),
289 cl::Prefix);
290
291static cl::alias
292ArgSearchDirListAlias("library-path",
293 cl::desc("alias for -L"),
294 cl::aliasopt(ArgSearchDirList));
295
296static cl::opt<bool>
297ArgTrace("t",
298 cl::desc("Print the names of the input files as ld processes them."));
299
300static cl::alias
301ArgTraceAlias("trace",
302 cl::desc("alias for -t"),
303 cl::aliasopt(ArgTrace));
304
305static cl::opt<bool>
306ArgVerbose("V",
307 cl::desc("Display the version number for ld and list the linker emulations supported."));
308
309static cl::alias
310ArgVerboseAlias("verbose",
311 cl::desc("alias for -V"),
312 cl::aliasopt(ArgVerbose));
313
314static cl::opt<std::string>
315ArgEntry("e",
316 cl::desc("Use entry as the explicit symbol for beginning execution of your program."),
317 cl::value_desc("entry"),
318 cl::ValueRequired);
319
320static cl::alias
321ArgEntryAlias("entry",
322 cl::desc("alias for -e"),
323 cl::aliasopt(ArgEntry));
324
325static cl::opt<bool>
326ArgBsymbolic("Bsymbolic",
327 cl::desc("Bind references within the shared library."),
328 cl::init(false));
329
330static cl::opt<std::string>
331ArgSOName("soname",
332 cl::desc("Set internal name of shared library"),
333 cl::value_desc("name"));
334
335//===----------------------------------------------------------------------===//
336// Inputs
337static cl::list<mcld::sys::fs::Path>
338ArgInputObjectFiles(cl::Positional,
339 cl::desc("[input object files]"),
340 cl::ZeroOrMore);
341
342static cl::list<std::string>
343ArgNameSpecList("l",
344 cl::ZeroOrMore,
345 cl::desc("Add the archive or object file specified by namespec to the list of files to link."),
346 cl::value_desc("namespec"),
347 cl::Prefix);
348
349static cl::alias
350ArgNameSpecListAlias("library",
351 cl::desc("alias for -l"),
352 cl::aliasopt(ArgNameSpecList));
353
354static cl::list<bool>
355ArgStartGroupList("start-group",
356 cl::ValueDisallowed,
357 cl::desc("start to record a group of archives"));
358
359static cl::alias
360ArgStartGroupListAlias("(",
361 cl::desc("alias for --start-group"),
362 cl::aliasopt(ArgStartGroupList));
363
364static cl::list<bool>
365ArgEndGroupList("end-group",
366 cl::ValueDisallowed,
367 cl::desc("stop recording a group of archives"));
368
369static cl::alias
370ArgEndGroupListAlias(")",
371 cl::desc("alias for --end-group"),
372 cl::aliasopt(ArgEndGroupList));
373
374//===----------------------------------------------------------------------===//
375// Attributes of Inputs
376static cl::list<bool>
377ArgWholeArchiveList("whole-archive",
378 cl::ValueDisallowed,
379 cl::desc("For each archive mentioned on the command line after the --whole-archive option, include all object files in the archive."));
380
381static cl::list<bool>
382ArgNoWholeArchiveList("no-whole-archive",
383 cl::ValueDisallowed,
384 cl::desc("Turn off the effect of the --whole-archive option for subsequent archive files."));
385
386static cl::list<bool>
387ArgAsNeededList("as-needed",
388 cl::ValueDisallowed,
389 cl::desc("This option affects ELF DT_NEEDED tags for dynamic libraries mentioned on the command line after the --as-needed option."));
390
391static cl::list<bool>
392ArgNoAsNeededList("no-as-needed",
393 cl::ValueDisallowed,
394 cl::desc("Turn off the effect of the --as-needed option for subsequent dynamic libraries"));
395
396static cl::list<bool>
397ArgAddNeededList("add-needed",
398 cl::ValueDisallowed,
399 cl::desc("--add-needed causes DT_NEEDED tags are always emitted for those libraries from DT_NEEDED tags. This is the default behavior."));
400
401static cl::list<bool>
402ArgNoAddNeededList("no-add-needed",
403 cl::ValueDisallowed,
404 cl::desc("--no-add-needed causes DT_NEEDED tags will never be emitted for those libraries from DT_NEEDED tags"));
405
406static cl::list<bool>
407ArgBDynamicList("Bdynamic",
408 cl::ValueDisallowed,
409 cl::desc("Link against dynamic library"));
410
411static cl::alias
412ArgBDynamicListAlias1("dy",
413 cl::desc("alias for --Bdynamic"),
414 cl::aliasopt(ArgBDynamicList));
415
416static cl::alias
417ArgBDynamicListAlias2("call_shared",
418 cl::desc("alias for --Bdynamic"),
419 cl::aliasopt(ArgBDynamicList));
420
421static cl::list<bool>
422ArgBStaticList("Bstatic",
423 cl::ValueDisallowed,
424 cl::desc("Link against static library"));
425
426static cl::alias
427ArgBStaticListAlias1("dn",
428 cl::desc("alias for --Bstatic"),
429 cl::aliasopt(ArgBStaticList));
430
431static cl::alias
432ArgBStaticListAlias2("static",
433 cl::desc("alias for --Bstatic"),
434 cl::aliasopt(ArgBStaticList));
435
436static cl::alias
437ArgBStaticListAlias3("non_shared",
438 cl::desc("alias for --Bstatic"),
439 cl::aliasopt(ArgBStaticList));
440
441//===----------------------------------------------------------------------===//
442// Scripting Options
443
444
445//===----------------------------------------------------------------------===//
446/// non-member functions
447
448// GetFileNameRoot - Helper function to get the basename of a filename.
449static inline void
450GetFileNameRoot(const std::string &pInputFilename, std::string& pFileNameRoot)
451{
452 std::string outputFilename;
453 /* *** */
454 const std::string& IFN = pInputFilename;
455 int Len = IFN.length();
456 if ((Len > 2) &&
457 IFN[Len-3] == '.' &&
458 ((IFN[Len-2] == 'b' && IFN[Len-1] == 'c') ||
459 (IFN[Len-2] == 'l' && IFN[Len-1] == 'l')))
460 pFileNameRoot = std::string(IFN.begin(), IFN.end()-3); // s/.bc/.s/
461 else
462 pFileNameRoot = std::string(IFN);
463}
464
465static tool_output_file *GetOutputStream(const char* pTargetName,
466 Triple::OSType pOSType,
467 mcld::CodeGenFileType pFileType,
468 const std::string& pInputFilename,
469 std::string& pOutputFilename)
470{
471 // If we don't yet have an output filename, make one.
472 if (pOutputFilename.empty()) {
473 if (pInputFilename == "-")
474 pOutputFilename = "-";
475 else {
476 GetFileNameRoot(pInputFilename, pOutputFilename);
477
478 switch (pFileType) {
479 case mcld::CGFT_ASMFile:
480 if (pTargetName[0] == 'c') {
481 if (pTargetName[1] == 0)
482 pOutputFilename += ".cbe.c";
483 else if (pTargetName[1] == 'p' && pTargetName[2] == 'p')
484 pOutputFilename += ".cpp";
485 else
486 pOutputFilename += ".s";
487 }
488 else
489 pOutputFilename += ".s";
490 break;
491 case mcld::CGFT_OBJFile:
492 if (pOSType == Triple::Win32)
493 pOutputFilename += ".obj";
494 else
495 pOutputFilename += ".o";
496 break;
497 case mcld::CGFT_DSOFile:
498 if (pOSType == Triple::Win32)
499 pOutputFilename += ".dll";
500 else
501 pOutputFilename += ".so";
502 break;
503 case mcld::CGFT_ARCFile:
504 pOutputFilename += ".a";
505 break;
506 case mcld::CGFT_EXEFile:
507 case mcld::CGFT_NULLFile:
508 // do nothing
509 break;
510 default:
511 assert(0 && "Unknown file type");
512 }
513 }
514 }
515
516 // Decide if we need "binary" output.
517 bool Binary = false;
518 switch (pFileType) {
519 default: assert(0 && "Unknown file type");
520 case mcld::CGFT_ASMFile:
521 break;
522 case mcld::CGFT_ARCFile:
523 case mcld::CGFT_OBJFile:
524 case mcld::CGFT_DSOFile:
525 case mcld::CGFT_EXEFile:
526 case mcld::CGFT_NULLFile:
527 Binary = true;
528 break;
529 }
530
531 // Open the file.
532 std::string error;
533 unsigned OpenFlags = 0;
534 if (Binary) OpenFlags |= raw_fd_ostream::F_Binary;
535 tool_output_file *FDOut = new tool_output_file(pOutputFilename.c_str(), error,
536 OpenFlags);
537 if (!error.empty()) {
538 errs() << error << '\n';
539 delete FDOut;
540 return 0;
541 }
542
543 return FDOut;
544}
545
546static bool ProcessLinkerInputsFromCommand(mcld::SectLinkerOption &pOption) {
547 // ----- Set up General Options ----- //
548 // set up soname
549 pOption.info().output().setSOName(ArgSOName);
550
551 // set up sysroot
552 if (!ArgSysRoot.empty()) {
553 if (exists(ArgSysRoot) && is_directory(ArgSysRoot))
554 pOption.info().options().setSysroot(ArgSysRoot);
555 }
556
557 // add all search directories
558 cl::list<mcld::MCLDDirectory>::iterator sd;
559 cl::list<mcld::MCLDDirectory>::iterator sdEnd = ArgSearchDirList.end();
560 for (sd=ArgSearchDirList.begin(); sd!=sdEnd; ++sd) {
561 if (sd->isInSysroot())
562 sd->setSysroot(pOption.info().options().sysroot());
563 if (exists(sd->path()) && is_directory(sd->path())) {
564 pOption.info().options().directories().add(*sd);
565 }
566 else {
567 // FIXME: need a warning function
568 errs() << "WARNING: can not open search directory `-L"
569 << sd->name()
570 << "'.\n";
571 }
572 }
573
574 pOption.info().options().setTrace(ArgTrace);
575 pOption.info().options().setVerbose(ArgVerbose);
576 pOption.info().options().setEntry(ArgEntry);
577 pOption.info().options().setBsymbolic(ArgBsymbolic);
578
579 // ----- Set up Inputs ----- //
580 // add all start-group
581 cl::list<bool>::iterator sg;
582 cl::list<bool>::iterator sgEnd = ArgStartGroupList.end();
583 for (sg=ArgStartGroupList.begin(); sg!=sgEnd; ++sg) {
584 // calculate position
585 pOption.appendOption(new mcld::StartGroupOption(
586 ArgStartGroupList.getPosition(sg-ArgStartGroupList.begin())));
587 }
588
589 // add all end-group
590 cl::list<bool>::iterator eg;
591 cl::list<bool>::iterator egEnd = ArgEndGroupList.end();
592 for (eg=ArgEndGroupList.begin(); eg!=egEnd; ++eg) {
593 // calculate position
594 pOption.appendOption(new mcld::EndGroupOption(
595 ArgEndGroupList.getPosition(eg-ArgEndGroupList.begin())));
596 }
597
598 // add all namespecs
599 cl::list<std::string>::iterator ns;
600 cl::list<std::string>::iterator nsEnd = ArgNameSpecList.end();
601 for (ns=ArgNameSpecList.begin(); ns!=nsEnd; ++ns) {
602 // calculate position
603 pOption.appendOption(new mcld::NamespecOption(
604 ArgNameSpecList.getPosition(ns-ArgNameSpecList.begin()),
605 *ns));
606 }
607
608 // add all object files
609 cl::list<mcld::sys::fs::Path>::iterator obj;
610 cl::list<mcld::sys::fs::Path>::iterator objEnd = ArgInputObjectFiles.end();
611 for (obj=ArgInputObjectFiles.begin(); obj!=objEnd; ++obj) {
612 // calculate position
613 pOption.appendOption(new mcld::InputFileOption(
614 ArgInputObjectFiles.getPosition(obj-ArgInputObjectFiles.begin()),
615 *obj));
616 }
617
618 // ----- Set up Attributes of Inputs ----- //
619 // --whole-archive
620 cl::list<bool>::iterator attr = ArgWholeArchiveList.begin();
621 cl::list<bool>::iterator attrEnd = ArgWholeArchiveList.end();
622 for (; attr!=attrEnd; ++attr) {
623 pOption.appendOption(new mcld::WholeArchiveOption(
624 ArgWholeArchiveList.getPosition(attr-ArgWholeArchiveList.begin())));
625 }
626
627 // --no-whole-archive
628 attr = ArgNoWholeArchiveList.begin();
629 attrEnd = ArgNoWholeArchiveList.end();
630 for (; attr!=attrEnd; ++attr) {
631 pOption.appendOption(new mcld::NoWholeArchiveOption(
632 ArgNoWholeArchiveList.getPosition(attr-ArgNoWholeArchiveList.begin())));
633 }
634
635 // --as-needed
636 attr = ArgAsNeededList.begin();
637 attrEnd = ArgAsNeededList.end();
638 while(attr != attrEnd) {
639 pOption.appendOption(new mcld::AsNeededOption(
640 ArgAsNeededList.getPosition(attr-ArgAsNeededList.begin())));
641 ++attr;
642 }
643
644 // --no-as-needed
645 attr = ArgNoAsNeededList.begin();
646 attrEnd = ArgNoAsNeededList.end();
647 while(attr != attrEnd) {
648 pOption.appendOption(new mcld::NoAsNeededOption(
649 ArgNoAsNeededList.getPosition(attr-ArgNoAsNeededList.begin())));
650 ++attr;
651 }
652
653 // --add-needed
654 attr = ArgAddNeededList.begin();
655 attrEnd = ArgAddNeededList.end();
656 while(attr != attrEnd) {
657 pOption.appendOption(new mcld::AddNeededOption(
658 ArgAddNeededList.getPosition(attr-ArgAddNeededList.begin())));
659 ++attr;
660 }
661
662 // --no-add-needed
663 attr = ArgNoAddNeededList.begin();
664 attrEnd = ArgNoAddNeededList.end();
665 while(attr != attrEnd) {
666 pOption.appendOption(new mcld::NoAddNeededOption(
667 ArgNoAddNeededList.getPosition(attr-ArgNoAddNeededList.begin())));
668 ++attr;
669 }
670
671 // -Bdynamic
672 attr = ArgBDynamicList.begin();
673 attrEnd = ArgBDynamicList.end();
674 while(attr != attrEnd) {
675 pOption.appendOption(new mcld::BDynamicOption(
676 ArgBDynamicList.getPosition(attr-ArgBDynamicList.begin())));
677 }
678
679 // -Bstatic
680 attr = ArgBStaticList.begin();
681 attrEnd = ArgBStaticList.end();
682 while(attr != attrEnd) {
683 pOption.appendOption(new mcld::BStaticOption(
684 ArgBStaticList.getPosition(attr-ArgBStaticList.begin())));
685 ++attr;
686 }
687
688 // ----- Set up Scripting Options ----- //
689
690 return false;
691}
692
693int main( int argc, char* argv[] )
694{
695
696 LLVMContext &Context = getGlobalContext();
697 llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
698 // Initialize targets first, so that --version shows registered targets.
699 InitializeAllTargets();
700 InitializeAllAsmPrinters();
701 InitializeAllAsmParsers();
702 InitializeAllTargetMCs();
703 mcld::InitializeAllTargets();
704 mcld::InitializeAllLinkers();
705 cl::ParseCommandLineOptions(argc, argv, "llvm MCLinker\n");
706
707#ifdef ENABLE_UNITTEST
708 if (UnitTest) {
709 return unit_test( argc, argv );
710 }
711#endif
712
713 // Load the module to be compiled...
714 std::auto_ptr<Module> M;
715
716 if (InputFilename.empty() && (FileType != mcld::CGFT_DSOFile)) {
717 // Read from stdin
718 InputFilename = "-";
719 }
720
721 if (!InputFilename.empty()) {
722 SMDiagnostic Err;
723 M.reset(ParseIRFile(InputFilename, Err, Context));
724
725 if (M.get() == 0) {
726 Err.print(argv[0], errs());
727 errs() << "** Failed to to the given bitcode/llvm asm file '"
728 << InputFilename << "'. **\n";
729 return 1;
730 }
731 } else {
732 // If here, output must be dynamic shared object (mcld::CGFT_DSOFile).
733
734 // Create an empty Module
735 M.reset(new Module("Empty Module", Context));
736 }
737 Module &mod = *M.get();
738
739 // If we are supposed to override the target triple, do so now.
740 Triple TheTriple;
741 if (!TargetTriple.empty()) {
742 TheTriple.setTriple(TargetTriple);
743 mod.setTargetTriple(TargetTriple);
744 }
745
746 // User doesn't specify the triple from command.
747 if (TheTriple.getTriple().empty()) {
748 // Try to get one from the input Module.
749 const std::string &TripleStr = mod.getTargetTriple();
750
751 if (TripleStr.empty())
752 TheTriple.setTriple(sys::getDefaultTargetTriple());
753 else
754 TheTriple.setTriple(TripleStr);
755 }
756
757 // Allocate target machine. First, check whether the user has explicitly
758 // specified an architecture to compile for. If so we have to look it up by
759 // name, because it might be a backend that has no mapping to a target triple.
760 const mcld::Target *TheTarget = 0;
761 if (!MArch.empty()) {
762 for (mcld::TargetRegistry::iterator it = mcld::TargetRegistry::begin(),
763 ie = mcld::TargetRegistry::end(); it != ie; ++it) {
764 if (MArch == (*it)->get()->getName()) {
765 TheTarget = *it;
766 break;
767 }
768 }
769
770 if (!TheTarget) {
771 errs() << argv[0] << ": error: invalid target '" << MArch << "'.\n";
772 return 1;
773 }
774
775 // Adjust the triple to match (if known), otherwise stick with the
776 // module/host triple.
777 Triple::ArchType Type = Triple::getArchTypeForLLVMName(MArch);
778 if (Type != Triple::UnknownArch)
779 TheTriple.setArch(Type);
780 }
781 else {
782 std::string Err;
783 TheTarget = mcld::TargetRegistry::lookupTarget(TheTriple.getTriple(), Err);
784 if (TheTarget == 0) {
785 errs() << argv[0] << ": error auto-selecting target for module '"
786 << Err << "'. Please use the -march option to explicitly "
787 << "pick a target.\n";
788 return 1;
789 }
790 }
791
792 // Package up features to be passed to target/subtarget
793 std::string FeaturesStr;
794 if (MAttrs.size()) {
795 SubtargetFeatures Features;
796 for (unsigned i = 0; i != MAttrs.size(); ++i)
797 Features.AddFeature(MAttrs[i]);
798 FeaturesStr = Features.getString();
799 }
800
801 CodeGenOpt::Level OLvl = CodeGenOpt::Default;
802 switch (OptLevel) {
803 default:
804 errs() << argv[0] << ": invalid optimization level.\n";
805 return 1;
806 case ' ': break;
807 case '0': OLvl = CodeGenOpt::None; break;
808 case '1': OLvl = CodeGenOpt::Less; break;
809 case '2': OLvl = CodeGenOpt::Default; break;
810 case '3': OLvl = CodeGenOpt::Aggressive; break;
811 }
812
813 TargetOptions Options;
814 Options.LessPreciseFPMADOption = EnableFPMAD;
815 Options.PrintMachineCode = PrintCode;
816 Options.NoFramePointerElim = DisableFPElim;
817 Options.NoFramePointerElimNonLeaf = DisableFPElimNonLeaf;
818 Options.NoExcessFPPrecision = DisableExcessPrecision;
819 Options.UnsafeFPMath = EnableUnsafeFPMath;
820 Options.NoInfsFPMath = EnableNoInfsFPMath;
821 Options.NoNaNsFPMath = EnableNoNaNsFPMath;
822 Options.HonorSignDependentRoundingFPMathOption =
823 EnableHonorSignDependentRoundingFPMath;
824 Options.UseSoftFloat = GenerateSoftFloatCalls;
825 if (FloatABIForCalls != FloatABI::Default)
826 Options.FloatABIType = FloatABIForCalls;
827 Options.NoZerosInBSS = DontPlaceZerosInBSS;
828 Options.JITExceptionHandling = EnableJITExceptionHandling;
829 Options.JITEmitDebugInfo = EmitJitDebugInfo;
830 Options.JITEmitDebugInfoToDisk = EmitJitDebugInfoToDisk;
831 Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt;
832 Options.StackAlignmentOverride = OverrideStackAlignment;
833 Options.RealignStack = EnableRealignStack;
834 Options.DisableJumpTables = DisableSwitchTables;
835 Options.TrapFuncName = TrapFuncName;
836 Options.EnableSegmentedStacks = SegmentedStacks;
837
838 std::auto_ptr<mcld::LLVMTargetMachine> target_machine(
839 TheTarget->createTargetMachine(TheTriple.getTriple(),
840 MCPU, FeaturesStr, Options,
841 RelocModel, CMModel, OLvl));
842 assert(target_machine.get() && "Could not allocate target machine!");
843 mcld::LLVMTargetMachine &TheTargetMachine = *target_machine.get();
844
845 TheTargetMachine.getTM().setMCUseLoc(false);
846 TheTargetMachine.getTM().setMCUseCFI(false);
847
848 // Figure out where we are going to send the output...
849 OwningPtr<tool_output_file>
850 Out(GetOutputStream(TheTarget->get()->getName(),
851 TheTriple.getOS(),
852 FileType,
853 InputFilename,
854 OutputFilename));
855 if (!Out) return 1;
856
857 // Build up all of the passes that we want to do to the module.
858 PassManager PM;
859
860 // Add the target data from the target machine, if it exists, or the module.
861 if (const TargetData *TD = TheTargetMachine.getTM().getTargetData())
862 PM.add(new TargetData(*TD));
863 else
864 PM.add(new TargetData(&mod));
865
866 // Override default to generate verbose assembly.
867 TheTargetMachine.getTM().setAsmVerbosityDefault(true);
868
869 // Process the linker input from the command line
870 mcld::SectLinkerOption *LinkerOpt =
871 new mcld::SectLinkerOption(TheTargetMachine.getLDInfo());
872
873 if (ProcessLinkerInputsFromCommand(*LinkerOpt)) {
874 errs() << argv[0] << ": failed to process inputs from command line!\n";
875 return 1;
876 }
877
878 {
879 formatted_raw_ostream FOS(Out->os());
880
881 // Ask the target to add backend passes as necessary.
882 if( TheTargetMachine.addPassesToEmitFile(PM,
883 FOS,
884 OutputFilename,
885 FileType,
886 OLvl,
887 LinkerOpt,
888 NoVerify)) {
889 errs() << argv[0] << ": target does not support generation of this"
890 << " file type!\n";
891 return 1;
892 }
893
894 // Before executing passes, print the final values of the LLVM options.
895 cl::PrintOptionValues();
896
897 PM.run(mod);
898 }
899
900 // Declare success.
901 Out->keep();
902
903 // clean up
904 delete LinkerOpt;
905
906 return 0;
907}
908