You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.1 KiB
107 lines
3.1 KiB
//===- 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
|