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