1//===- FileAction.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/MC/FileAction.h>
10#include <mcld/MC/MCLDInput.h>
11#include <mcld/MC/InputBuilder.h>
12#include <mcld/MC/ContextFactory.h>
13#include <mcld/Support/MemoryAreaFactory.h>
14
15using namespace mcld;
16
17//===----------------------------------------------------------------------===//
18// ContextAction
19//===----------------------------------------------------------------------===//
20ContextAction::ContextAction(unsigned int pPosition)
21  : InputAction(pPosition) {
22}
23
24bool ContextAction::activate(InputBuilder& pBuilder) const
25{
26  Input* input = *pBuilder.getCurrentNode();
27
28  if (input->hasContext())
29    return false;
30
31  // already got type - for example, bitcode
32  if (input->type() == Input::Script ||
33      input->type() == Input::Object ||
34      input->type() == Input::DynObj  ||
35      input->type() == Input::Archive)
36    return false;
37
38  return pBuilder.setContext(*input);
39}
40
41//===----------------------------------------------------------------------===//
42// MemoryAreaAction
43//===----------------------------------------------------------------------===//
44MemoryAreaAction::MemoryAreaAction(unsigned int pPosition,
45                                   FileHandle::OpenMode pMode,
46                                   FileHandle::Permission pPerm)
47  : InputAction(pPosition), m_Mode(pMode), m_Permission(pPerm) {
48}
49
50bool MemoryAreaAction::activate(InputBuilder& pBuilder) const
51{
52  Input* input = *pBuilder.getCurrentNode();
53
54  if (input->hasMemArea())
55    return false;
56
57  // already got type - for example, bitcode
58  if (input->type() == Input::Script ||
59      input->type() == Input::Object ||
60      input->type() == Input::DynObj  ||
61      input->type() == Input::Archive)
62    return false;
63
64  return pBuilder.setMemory(*input, m_Mode, m_Permission);
65}
66
67