122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- MCLinker.cpp -------------------------------------------------------===//
222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//                     The MCLinker Project
422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source
622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details.
722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file implements the MCLinker class.
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/CodeGen/MCLinker.h>
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Module.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LinkerConfig.h>
17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/LinkerScript.h>
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/InputTree.h>
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Linker.h>
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/IRBuilder.h>
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/InputBuilder.h>
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/FileAction.h>
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/CommandAction.h>
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Object/ObjectLinker.h>
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/CommandLine.h>
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/FileSystem.h>
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/MsgHandling.h>
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/FileHandle.h>
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/raw_ostream.h>
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3186036a3bd999904d071826b2f0a84023e28aeebcShih-wei Liao#include <llvm/IR/Module.h>
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/CommandLine.h>
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <algorithm>
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <vector>
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string>
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace mcld;
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace llvm;
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaochar MCLinker::m_ID = 0;
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Help Functions
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic inline bool CompareAction(const InputAction* X, const InputAction* Y)
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return (X->position() < Y->position());
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Positional Options
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// There are four kinds of positional options:
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//   1. Inputs, object files, such as /tmp/XXXX.o
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//   2. Namespecs, short names of libraries. A namespec may refer to an archive
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//      or a shared library. For example, -lm.
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//   3. Attributes of inputs. Attributes describe inputs appears after them.
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//      For example, --as-needed and --whole-archive.
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//   4. Groups. A Group is a set of archives. Linkers repeatedly read archives
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//      in groups until there is no new undefined symbols.
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//   5. Bitcode. Bitcode is a kind of object files. MCLinker compiles it to
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//      object file first, then link it as a object file. (Bitcode is recorded
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//      in BitcodeOption, not be read by LLVM Command Line library.)
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Inputs
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::list<mcld::sys::fs::Path>
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgInputObjectFiles(cl::Positional,
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                    cl::desc("[input object files]"),
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                    cl::ZeroOrMore);
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Namespecs
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::list<std::string>
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgNameSpecList("l",
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            cl::ZeroOrMore,
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            cl::desc("Add the archive or object file specified by namespec to "
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                     "the list of files to link."),
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            cl::value_desc("namespec"),
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            cl::Prefix);
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::alias
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgNameSpecListAlias("library",
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                 cl::desc("alias for -l"),
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                 cl::aliasopt(ArgNameSpecList));
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Attributes
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::list<bool>
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgWholeArchiveList("whole-archive",
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               cl::ValueDisallowed,
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               cl::desc("For each archive mentioned on the command line after "
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                        "the --whole-archive option, include all object files "
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                        "in the archive."));
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::list<bool>
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgNoWholeArchiveList("no-whole-archive",
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               cl::ValueDisallowed,
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               cl::desc("Turn off the effect of the --whole-archive option for "
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                        "subsequent archive files."));
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::list<bool>
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgAsNeededList("as-needed",
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               cl::ValueDisallowed,
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               cl::desc("This option affects ELF DT_NEEDED tags for dynamic "
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                        "libraries mentioned on the command line after the "
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                        "--as-needed option."));
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::list<bool>
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgNoAsNeededList("no-as-needed",
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               cl::ValueDisallowed,
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               cl::desc("Turn off the effect of the --as-needed option for "
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                        "subsequent dynamic libraries"));
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::list<bool>
11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgAddNeededList("add-needed",
11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::ValueDisallowed,
12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::desc("--add-needed causes DT_NEEDED tags are always "
12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                         "emitted for those libraries from DT_NEEDED tags. "
12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                         "This is the default behavior."));
12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::list<bool>
12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgNoAddNeededList("no-add-needed",
12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::ValueDisallowed,
12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::desc("--no-add-needed causes DT_NEEDED tags will never be "
12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                         "emitted for those libraries from DT_NEEDED tags"));
12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::list<bool>
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgBDynamicList("Bdynamic",
13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::ValueDisallowed,
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::desc("Link against dynamic library"));
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::alias
13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgBDynamicListAlias1("dy",
13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::desc("alias for --Bdynamic"),
13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::aliasopt(ArgBDynamicList));
13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::alias
14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgBDynamicListAlias2("call_shared",
14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::desc("alias for --Bdynamic"),
14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::aliasopt(ArgBDynamicList));
14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::list<bool>
14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgBStaticList("Bstatic",
14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::ValueDisallowed,
14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::desc("Link against static library"));
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::alias
15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgBStaticListAlias1("dn",
15222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::desc("alias for --Bstatic"),
15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::aliasopt(ArgBStaticList));
15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::alias
15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgBStaticListAlias2("static",
15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::desc("alias for --Bstatic"),
15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::aliasopt(ArgBStaticList));
15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::alias
16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgBStaticListAlias3("non_shared",
16222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::desc("alias for --Bstatic"),
16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::aliasopt(ArgBStaticList));
16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Groups
16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::list<bool>
16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgStartGroupList("start-group",
17022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                  cl::ValueDisallowed,
17122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                  cl::desc("start to record a group of archives"));
17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::alias
17422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgStartGroupListAlias("(",
17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       cl::desc("alias for --start-group"),
17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       cl::aliasopt(ArgStartGroupList));
17722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::list<bool>
17922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgEndGroupList("end-group",
18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::ValueDisallowed,
18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                cl::desc("stop recording a group of archives"));
18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic cl::alias
18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArgEndGroupListAlias(")",
18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                     cl::desc("alias for --end-group"),
18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                     cl::aliasopt(ArgEndGroupList));
18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
189f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// --defsym
190f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
191f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesstatic cl::list<std::string>
192f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesArgDefSymList("defsym",
193f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines              cl::ZeroOrMore,
194f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines              cl::desc("Define a symbol"),
195f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines              cl::value_desc("symbol=expression"));
196f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
197f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
19822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// MCLinker
19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
20022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoMCLinker::MCLinker(LinkerConfig& pConfig,
20122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                   mcld::Module& pModule,
202f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                   FileHandle& pFileHandle)
20322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  : MachineFunctionPass(m_ID),
20422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Config(pConfig),
20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Module(pModule),
206f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    m_FileHandle(pFileHandle),
20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pBuilder(NULL),
20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pLinker(NULL) {
20922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
21022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoMCLinker::~MCLinker()
21222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
21322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pLinker;
21422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pBuilder;
21522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
21622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
21722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool MCLinker::doInitialization(llvm::Module &pM)
21822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
21922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // Now, all input arguments are prepared well, send it into ObjectLinker
22022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pLinker = new Linker();
22122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
222f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (!m_pLinker->emulate(m_Module.getScript(), m_Config))
22322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return false;
22422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pBuilder = new IRBuilder(m_Module, m_Config);
22622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  initializeInputTree(*m_pBuilder);
22822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
23022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
23122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
23222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool MCLinker::doFinalization(llvm::Module &pM)
23322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
23422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (!m_pLinker->link(m_Module, *m_pBuilder))
23522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return true;
23622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
237f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  if (!m_pLinker->emit(m_Module, m_FileHandle.handler()))
23822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return true;
23922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
24022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return false;
24122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
24222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
24322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool MCLinker::runOnMachineFunction(MachineFunction& pF)
24422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
24522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // basically, linkers do nothing during function is generated.
24622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return false;
24722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
24822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
24922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid MCLinker::initializeInputTree(IRBuilder& pBuilder)
25022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
25122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (0 == ArgInputObjectFiles.size() &&
25222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      0 == ArgNameSpecList.size() &&
25322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      !m_Config.bitcode().hasDefined()) {
25422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    fatal(diag::err_no_inputs);
25522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return;
25622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
25722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
25822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t num_actions = ArgInputObjectFiles.size() +
25922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       ArgNameSpecList.size() +
26022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       ArgWholeArchiveList.size() +
26122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       ArgNoWholeArchiveList.size() +
26222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       ArgAsNeededList.size() +
26322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       ArgNoAsNeededList.size() +
26422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       ArgAddNeededList.size() +
26522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       ArgNoAddNeededList.size() +
26622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       ArgBDynamicList.size() +
26722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       ArgBStaticList.size() +
26822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       ArgStartGroupList.size() +
26922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       ArgEndGroupList.size() +
270f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                       ArgDefSymList.size() +
27122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       1; // bitcode
27222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  std::vector<InputAction*> actions;
27322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  actions.reserve(num_actions);
27422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
275f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // -----  scripts  ----- //
276f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  /// -T
277f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  if (!m_Config.options().getScriptList().empty()) {
278f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    GeneralOptions::const_script_iterator ii, ie = m_Config.options().script_end();
279f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    for (ii = m_Config.options().script_begin(); ii != ie; ++ii) {
280f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines      actions.push_back(new ScriptAction(0x0,
281f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                         *ii,
282f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                         ScriptFile::LDScript,
283f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                         m_Module.getScript().directories()));
284f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines      actions.push_back(new ContextAction(0x0));
285f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines      actions.push_back(new MemoryAreaAction(0x0, FileHandle::ReadOnly));
286f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    }
287f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  }
288f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
289f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  /// --defsym
290f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  cl::list<std::string>::iterator defsym, dsBegin, dsEnd;
291f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  dsBegin = ArgDefSymList.begin();
292f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  dsEnd = ArgDefSymList.end();
293f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  for (defsym = dsBegin; defsym != dsEnd; ++defsym) {
294f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    unsigned int pos = ArgDefSymList.getPosition(defsym - dsBegin);
295f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    actions.push_back(new DefSymAction(pos, *defsym));
296f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  }
297f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
29822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  inputs  ----- //
29922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  cl::list<mcld::sys::fs::Path>::iterator input, inBegin, inEnd;
30022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  inBegin = ArgInputObjectFiles.begin();
30122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  inEnd = ArgInputObjectFiles.end();
30222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (input = inBegin; input != inEnd; ++input) {
30322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int pos = ArgInputObjectFiles.getPosition(input - inBegin);
30422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new InputFileAction(pos, *input));
30522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new ContextAction(pos));
30622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new MemoryAreaAction(pos, FileHandle::ReadOnly));
30722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
30822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
30922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  namespecs  ----- //
31022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  cl::list<std::string>::iterator namespec, nsBegin, nsEnd;
31122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  nsBegin = ArgNameSpecList.begin();
31222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  nsEnd = ArgNameSpecList.end();
31322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (namespec = nsBegin; namespec != nsEnd; ++namespec) {
31422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int pos = ArgNameSpecList.getPosition(namespec - nsBegin);
31522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new NamespecAction(pos, *namespec,
316f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                         m_Module.getScript().directories()));
31722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new ContextAction(pos));
31822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new MemoryAreaAction(pos, FileHandle::ReadOnly));
31922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
32022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
32122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  attributes  ----- //
32222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// --whole-archive
32322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  cl::list<bool>::iterator attr, attrBegin, attrEnd;
32422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrBegin = ArgWholeArchiveList.begin();
32522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrEnd   = ArgWholeArchiveList.end();
32622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (attr = attrBegin; attr != attrEnd; ++attr) {
32722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int pos = ArgWholeArchiveList.getPosition(attr - attrBegin);
32822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new WholeArchiveAction(pos));
32922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
33022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
33122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// --no-whole-archive
33222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrBegin = ArgNoWholeArchiveList.begin();
33322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrEnd   = ArgNoWholeArchiveList.end();
33422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (attr = attrBegin; attr != attrEnd; ++attr) {
33522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int pos = ArgNoWholeArchiveList.getPosition(attr - attrBegin);
33622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new NoWholeArchiveAction(pos));
33722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
33822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
33922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// --as-needed
34022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrBegin = ArgAsNeededList.begin();
34122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrEnd   = ArgAsNeededList.end();
34222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (attr = attrBegin; attr != attrEnd; ++attr) {
34322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int pos = ArgAsNeededList.getPosition(attr - attrBegin);
34422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new AsNeededAction(pos));
34522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
34622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
34722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// --no-as-needed
34822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrBegin = ArgNoAsNeededList.begin();
34922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrEnd   = ArgNoAsNeededList.end();
35022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (attr = attrBegin; attr != attrEnd; ++attr) {
35122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int pos = ArgNoAsNeededList.getPosition(attr - attrBegin);
35222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new NoAsNeededAction(pos));
35322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
35422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
35522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// --add--needed
35622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrBegin = ArgAddNeededList.begin();
35722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrEnd   = ArgAddNeededList.end();
35822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (attr = attrBegin; attr != attrEnd; ++attr) {
35922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int pos = ArgAddNeededList.getPosition(attr - attrBegin);
36022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new AddNeededAction(pos));
36122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
36222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
36322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// --no-add--needed
36422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrBegin = ArgNoAddNeededList.begin();
36522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrEnd   = ArgNoAddNeededList.end();
36622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (attr = attrBegin; attr != attrEnd; ++attr) {
36722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int pos = ArgNoAddNeededList.getPosition(attr - attrBegin);
36822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new NoAddNeededAction(pos));
36922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
37022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
37122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// --Bdynamic
37222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrBegin = ArgBDynamicList.begin();
37322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrEnd   = ArgBDynamicList.end();
37422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (attr = attrBegin; attr != attrEnd; ++attr) {
37522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int pos = ArgBDynamicList.getPosition(attr - attrBegin);
37622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new BDynamicAction(pos));
37722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
37822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
37922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// --Bstatic
38022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrBegin = ArgBStaticList.begin();
38122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  attrEnd   = ArgBStaticList.end();
38222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (attr = attrBegin; attr != attrEnd; ++attr) {
38322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int pos = ArgBStaticList.getPosition(attr - attrBegin);
38422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new BStaticAction(pos));
38522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
38622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
38722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  groups  ----- //
38822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// --start-group
38922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  cl::list<bool>::iterator group, gsBegin, gsEnd;
39022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  gsBegin = ArgStartGroupList.begin();
39122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  gsEnd   = ArgStartGroupList.end();
39222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (group = gsBegin; group != gsEnd; ++group) {
39322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int pos = ArgStartGroupList.getPosition(group - gsBegin);
39422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new StartGroupAction(pos));
39522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
39622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
39722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// --end-group
39822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  gsBegin = ArgEndGroupList.begin();
39922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  gsEnd   = ArgEndGroupList.end();
40022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (group = gsBegin; group != gsEnd; ++group) {
40122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int pos = ArgEndGroupList.getPosition(group - gsBegin);
40222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new EndGroupAction(pos));
40322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
40422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
40522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  bitcode  ----- //
40622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (m_Config.bitcode().hasDefined()) {
40722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    actions.push_back(new BitcodeAction(m_Config.bitcode().getPosition(),
40822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                        m_Config.bitcode().getPath()));
40922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
41022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
41122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // stable sort
41222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  std::stable_sort(actions.begin(), actions.end(), CompareAction);
41322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
41422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // build up input tree
41522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  std::vector<InputAction*>::iterator action, actionEnd = actions.end();
41622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (action = actions.begin(); action != actionEnd; ++action) {
41722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    (*action)->activate(pBuilder.getInputBuilder());
4186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    delete *action;
41922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
42022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
42122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (pBuilder.getInputBuilder().isInGroup())
42222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    report_fatal_error("no matched --start-group and --end-group");
42322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
42422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
425