| //===- InputSectDesc.cpp --------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #include "mcld/Script/InputSectDesc.h" |
| |
| #include "mcld/Script/WildcardPattern.h" |
| #include "mcld/Support/raw_ostream.h" |
| #include "mcld/LinkerScript.h" |
| #include "mcld/Module.h" |
| |
| #include <llvm/Support/Casting.h> |
| |
| namespace mcld { |
| |
| //===----------------------------------------------------------------------===// |
| // InputSectDesc |
| //===----------------------------------------------------------------------===// |
| InputSectDesc::InputSectDesc(KeepPolicy pPolicy, |
| const Spec& pSpec, |
| const OutputSectDesc& pOutputDesc) |
| : ScriptCommand(ScriptCommand::INPUT_SECT_DESC), |
| m_KeepPolicy(pPolicy), |
| m_Spec(pSpec), |
| m_OutputSectDesc(pOutputDesc) { |
| } |
| |
| InputSectDesc::~InputSectDesc() { |
| } |
| |
| void InputSectDesc::dump() const { |
| if (m_KeepPolicy == Keep) |
| mcld::outs() << "KEEP ("; |
| |
| assert(m_Spec.hasFile()); |
| if (m_Spec.file().sortPolicy() == WildcardPattern::SORT_BY_NAME) |
| mcld::outs() << "SORT ("; |
| |
| mcld::outs() << m_Spec.file().name(); |
| |
| if (m_Spec.hasSections()) { |
| mcld::outs() << "("; |
| |
| if (m_Spec.hasExcludeFiles()) { |
| mcld::outs() << "EXCLUDE_FILE ("; |
| for (StringList::const_iterator it = m_Spec.excludeFiles().begin(), |
| ie = m_Spec.excludeFiles().end(); |
| it != ie; |
| ++it) { |
| mcld::outs() << (*it)->name() << " "; |
| } |
| mcld::outs() << ")"; |
| } |
| |
| if (m_Spec.hasSections()) { |
| for (StringList::const_iterator it = m_Spec.sections().begin(), |
| ie = m_Spec.sections().end(); |
| it != ie; |
| ++it) { |
| assert((*it)->kind() == StrToken::Wildcard); |
| WildcardPattern* wildcard = llvm::cast<WildcardPattern>(*it); |
| |
| switch (wildcard->sortPolicy()) { |
| case WildcardPattern::SORT_BY_NAME: |
| mcld::outs() << "SORT ("; |
| break; |
| case WildcardPattern::SORT_BY_ALIGNMENT: |
| mcld::outs() << "SORT_BY_ALIGNMENT ("; |
| break; |
| case WildcardPattern::SORT_BY_NAME_ALIGNMENT: |
| mcld::outs() << "SORT_BY_NAME_ALIGNMENT ("; |
| break; |
| case WildcardPattern::SORT_BY_ALIGNMENT_NAME: |
| mcld::outs() << "SORT_BY_ALIGNMENT_NAME ("; |
| break; |
| default: |
| break; |
| } |
| |
| mcld::outs() << wildcard->name() << " "; |
| |
| if (wildcard->sortPolicy() != WildcardPattern::SORT_NONE) |
| mcld::outs() << ")"; |
| } |
| } |
| mcld::outs() << ")"; |
| } |
| |
| if (m_Spec.file().sortPolicy() == WildcardPattern::SORT_BY_NAME) |
| mcld::outs() << ")"; |
| |
| if (m_KeepPolicy == Keep) |
| mcld::outs() << ")"; |
| |
| mcld::outs() << "\n"; |
| } |
| |
| void InputSectDesc::activate(Module& pModule) { |
| pModule.getScript().sectionMap().insert(*this, m_OutputSectDesc); |
| } |
| |
| } // namespace mcld |