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