1 //===- InputSectDesc.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/Script/InputSectDesc.h>
10 #include <mcld/Script/WildcardPattern.h>
11 #include <mcld/Support/raw_ostream.h>
12 #include <mcld/LinkerScript.h>
13 #include <mcld/Module.h>
14 #include <llvm/Support/Casting.h>
15
16 using namespace mcld;
17
18 //===----------------------------------------------------------------------===//
19 // InputSectDesc
20 //===----------------------------------------------------------------------===//
InputSectDesc(KeepPolicy pPolicy,const Spec & pSpec,const OutputSectDesc & pOutputDesc)21 InputSectDesc::InputSectDesc(KeepPolicy pPolicy,
22 const Spec& pSpec,
23 const OutputSectDesc& pOutputDesc)
24 : ScriptCommand(ScriptCommand::INPUT_SECT_DESC),
25 m_KeepPolicy(pPolicy),
26 m_Spec(pSpec),
27 m_OutputSectDesc(pOutputDesc)
28 {
29 }
30
~InputSectDesc()31 InputSectDesc::~InputSectDesc()
32 {
33 }
34
dump() const35 void InputSectDesc::dump() const
36 {
37 if (m_KeepPolicy == Keep)
38 mcld::outs() << "KEEP (";
39
40 assert (m_Spec.hasFile());
41 if (m_Spec.file().sortPolicy() == WildcardPattern::SORT_BY_NAME)
42 mcld::outs() << "SORT (";
43
44 mcld::outs() << m_Spec.file().name();
45
46 if (m_Spec.hasSections()) {
47 mcld::outs() << "(";
48
49 if (m_Spec.hasExcludeFiles()) {
50 mcld::outs() << "EXCLUDE_FILE (";
51 for (StringList::const_iterator it = m_Spec.excludeFiles().begin(),
52 ie = m_Spec.excludeFiles().end(); it != ie; ++it) {
53 mcld::outs() << (*it)->name() << " ";
54 }
55 mcld::outs() << ")";
56 }
57
58 if (m_Spec.hasSections()) {
59 for (StringList::const_iterator it = m_Spec.sections().begin(),
60 ie = m_Spec.sections().end(); it != ie; ++it) {
61 assert((*it)->kind() == StrToken::Wildcard);
62 WildcardPattern* wildcard = llvm::cast<WildcardPattern>(*it);
63
64 switch (wildcard->sortPolicy()) {
65 case WildcardPattern::SORT_BY_NAME:
66 mcld::outs() << "SORT (";
67 break;
68 case WildcardPattern::SORT_BY_ALIGNMENT:
69 mcld::outs() << "SORT_BY_ALIGNMENT (";
70 break;
71 case WildcardPattern::SORT_BY_NAME_ALIGNMENT:
72 mcld::outs() << "SORT_BY_NAME_ALIGNMENT (";
73 break;
74 case WildcardPattern::SORT_BY_ALIGNMENT_NAME:
75 mcld::outs() << "SORT_BY_ALIGNMENT_NAME (";
76 break;
77 default:
78 break;
79 }
80
81 mcld::outs() << wildcard->name() << " ";
82
83 if (wildcard->sortPolicy() != WildcardPattern::SORT_NONE)
84 mcld::outs() << ")";
85 }
86 }
87 mcld::outs() << ")";
88 }
89
90 if (m_Spec.file().sortPolicy() == WildcardPattern::SORT_BY_NAME)
91 mcld::outs() << ")";
92
93 if (m_KeepPolicy == Keep)
94 mcld::outs() << ")";
95
96 mcld::outs() << "\n";
97 }
98
activate(Module & pModule)99 void InputSectDesc::activate(Module& pModule)
100 {
101 pModule.getScript().sectionMap().insert(*this, m_OutputSectDesc);
102 }
103