193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao/*
293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * Copyright 2012, The Android Open Source Project
393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao *
493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * you may not use this file except in compliance with the License.
693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * You may obtain a copy of the License at
793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao *
893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao *     http://www.apache.org/licenses/LICENSE-2.0
993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao *
1093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * Unless required by applicable law or agreed to in writing, software
1193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS,
1293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * See the License for the specific language governing permissions and
1493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao * limitations under the License.
1593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao */
1693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
1793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include "bcc/Support/LinkerConfig.h"
1893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include "bcc/Support/Log.h"
1993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
2093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <llvm/Support/Signals.h>
2193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
2252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao#include <mcld/LinkerConfig.h>
2393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <mcld/MC/MCLDDirectory.h>
24f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao#include <mcld/MC/ZOption.h>
2593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <mcld/LD/TextDiagnosticPrinter.h>
2693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <mcld/Support/Path.h>
2793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <mcld/Support/MsgHandling.h>
2893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao#include <mcld/Support/raw_ostream.h>
2993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
3093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaousing namespace bcc;
3193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
3293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei LiaoLinkerConfig::LinkerConfig(const std::string &pTriple)
3352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  : mTriple(pTriple), mSOName(), mTarget(NULL), mLDConfig(NULL),
3493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    mDiagLineInfo(NULL), mDiagPrinter(NULL) {
3593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
3693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  initializeTarget();
3793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  initializeLDInfo();
3893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  initializeDiagnostic();
3993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
4093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
4193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei LiaoLinkerConfig::~LinkerConfig() {
4252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  delete mLDConfig;
4393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
4493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  if (mDiagPrinter->getNumErrors() != 0) {
4593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    // If here, the program failed ungracefully. Run the interrupt handlers to
4693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    // ensure any other cleanups (e.g., files that registered by
4793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    // RemoveFileOnSignal(...)) getting done before exit.
4893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    llvm::sys::RunInterruptHandlers();
4993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  }
5093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  mDiagPrinter->finish();
5193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
5293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  delete mDiagLineInfo;
5393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  delete mDiagPrinter;
5493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
5593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
5693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaobool LinkerConfig::initializeTarget() {
5793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  std::string error;
5893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  mTarget = mcld::TargetRegistry::lookupTarget(mTriple, error);
5993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  if (NULL != mTarget) {
6093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    return true;
6193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  } else {
6293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    ALOGE("Cannot initialize mcld::Target for given triple '%s'! (%s)\n",
6393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao          mTriple.c_str(), error.c_str());
6493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    return false;
6593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  }
6693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
6793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
6893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaobool LinkerConfig::initializeLDInfo() {
6952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  if (NULL != mLDConfig) {
7093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    ALOGE("Cannot initialize mcld::MCLDInfo for given triple '%s!\n",
7193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao          mTriple.c_str());
7293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    return false;
7393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  }
7493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
7552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  mLDConfig = new mcld::LinkerConfig(getTriple());
7652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  mLDConfig->setCodeGenType(mcld::LinkerConfig::Exec);
7752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao
7852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  struct NameMap {
7952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    const char* from;
8052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    const char* to;
8152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  };
8252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao
8352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  static const NameMap map[] =
8452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  {
8552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".text", ".text"},
8652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".rodata", ".rodata"},
8752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".data.rel.ro.local", ".data.rel.ro.local"},
8852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".data.rel.ro", ".data.rel.ro"},
8952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".data", ".data"},
9052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".bss", ".bss"},
9152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".tdata", ".tdata"},
9252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".tbss", ".tbss"},
9352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".init_array", ".init_array"},
9452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".fini_array", ".fini_array"},
9552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    // TODO: Support DT_INIT_ARRAY for all constructors?
9652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".ctors", ".ctors"},
9752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".dtors", ".dtors"},
9852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    // FIXME: in GNU ld, if we are creating a shared object .sdata2 and .sbss2
9952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    // sections would be handled differently.
10052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".sdata2", ".sdata"},
10152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".sbss2", ".sbss"},
10252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".sdata", ".sdata"},
10352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".sbss", ".sbss"},
10452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".lrodata", ".lrodata"},
10552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".ldata", ".ldata"},
10652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".lbss", ".lbss"},
10752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gcc_except_table", ".gcc_except_table"},
10852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.d.rel.ro.local", ".data.rel.ro.local"},
10952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.d.rel.ro", ".data.rel.ro"},
11052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.r", ".rodata"},
11152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.d", ".data"},
11252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.b", ".bss"},
11352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.sb2", ".sbss"},
11452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.sb", ".sbss"},
11552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.s2", ".sdata"},
11652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.s", ".sdata"},
11752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.wi", ".debug_info"},
11852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.td", ".tdata"},
11952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.tb", ".tbss"},
12052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.t", ".text"},
12152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.lr", ".lrodata"},
12252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.lb", ".lbss"},
12352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    {".gnu.linkonce.l", ".ldata"},
12452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  };
12552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao
12652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  if (mLDConfig->codeGenType() != mcld::LinkerConfig::Object) {
12752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    const unsigned int map_size =  (sizeof(map) / sizeof(map[0]) );
12852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    for (unsigned int i = 0; i < map_size; ++i) {
12952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao      bool exist = false;
13052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao      mLDConfig->scripts().sectionMap().append(map[i].from,
13152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao                                               map[i].to,
13252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao                                               exist);
13352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    }
13452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  }
13593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  return true;
13693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
13793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
13893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaobool LinkerConfig::initializeDiagnostic() {
13993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  // Set up MsgHandler.
14052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  mDiagPrinter = new mcld::TextDiagnosticPrinter(mcld::errs(), *mLDConfig);
14193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
14252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  mcld::InitializeDiagnosticEngine(*mLDConfig, mDiagPrinter);
14393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
14452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  mDiagLineInfo = mTarget->createDiagnosticLineInfo(*mTarget, mTriple);
14593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
14652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  mcld::getDiagnosticEngine().setLineInfo(*mDiagLineInfo);
14793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  return true;
14893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
14993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
15052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liaobool LinkerConfig::isShared() const {
15152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  return (mcld::LinkerConfig::DynObj == mLDConfig->codeGenType());
15252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao}
15352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao
15493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::setShared(bool pEnable) {
15552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  if (pEnable)
15652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->setCodeGenType(mcld::LinkerConfig::DynObj);
15752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  else
15852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->setCodeGenType(mcld::LinkerConfig::Exec);
15993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  return;
16093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
16193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
16293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::setBsymbolic(bool pEnable) {
16352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  mLDConfig->options().setBsymbolic(pEnable);
16493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  return;
16593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
16693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
167ca4f96c0f1fcf7a2bdc5a432b751befff149f73dShih-wei Liaovoid LinkerConfig::setDefineCommon(bool pEnable) {
168ca4f96c0f1fcf7a2bdc5a432b751befff149f73dShih-wei Liao  mLDConfig->options().setDefineCommon(pEnable);
169ca4f96c0f1fcf7a2bdc5a432b751befff149f73dShih-wei Liao  return;
170ca4f96c0f1fcf7a2bdc5a432b751befff149f73dShih-wei Liao}
171ca4f96c0f1fcf7a2bdc5a432b751befff149f73dShih-wei Liao
17293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::setSOName(const std::string &pSOName) {
17352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  mLDConfig->options().setSOName(pSOName);
17493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  return;
17593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
17693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
17793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::setDyld(const std::string &pDyld) {
17852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  mLDConfig->options().setDyld(pDyld);
17993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  return;
18093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
18193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
18293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::setSysRoot(const std::string &pSysRoot) {
18352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  mLDConfig->options().setSysroot(mcld::sys::fs::Path(pSysRoot));
18493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  return;
18593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
18693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
187f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liaovoid LinkerConfig::setZOption(unsigned int pOptions) {
188f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  mcld::ZOption option;
189f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kCombReloc) {
190f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::CombReloc);
19152acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
192f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
193f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  else {
194f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::NoCombReloc);
19552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
196f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
197f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
198f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kDefs) {
199f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::Defs);
20052acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
201f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
202f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
203f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kExecStack) {
204f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::ExecStack);
20552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
206f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
207f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  else {
208f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::NoExecStack);
20952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
210f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
211f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
212f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kInitFirst) {
213f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::InitFirst);
21452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
215f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
216f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
217f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kInterPose) {
218f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::InterPose);
21952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
220f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
221f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
222f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kLoadFltr) {
223f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::LoadFltr);
22452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
225f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
226f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
227f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kMulDefs) {
228f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::MulDefs);
22952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
230f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
231f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
232f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kNoCopyReloc) {
233f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::NoCopyReloc);
23452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
235f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
236f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
237f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kNoDefaultLib) {
238f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::NoDefaultLib);
23952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
240f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
241f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
242f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kNoDelete) {
243f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::NoDelete);
24452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
245f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
246f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
247f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kNoDLOpen) {
248f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::NoDLOpen);
24952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
250f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
251f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
252f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kNoDump) {
253f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::NoDump);
25452acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
255f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
256f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
257f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kRelro) {
258f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::Relro);
25952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
260f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
261f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  else {
262f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::NoRelro);
26352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
264f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
265f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
266f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kLazy) {
267f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::Lazy);
26852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
269f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
270f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  else {
271f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::Now);
27252acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
273f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
274f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
275f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  if (pOptions & kOrigin) {
276f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao    option.setKind(mcld::ZOption::Origin);
27752acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mLDConfig->options().addZOption(option);
278f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao  }
279f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao}
280f3eb9b8c5bb3198aff2878de4dae4e70e5ef3900Shih-wei Liao
28193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::addWrap(const std::string &pWrapSymbol) {
28293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  bool exist = false;
28393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
28493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  // Add wname -> __wrap_wname.
28593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  mcld::StringEntry<llvm::StringRef>* to_wrap =
28652acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao               mLDConfig->scripts().renameMap().insert(pWrapSymbol, exist);
28793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
28893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  std::string to_wrap_str = "__wrap_" + pWrapSymbol;
28993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  to_wrap->setValue(to_wrap_str);
29093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
29193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  if (exist) {
29293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    mcld::warning(mcld::diag::rewrap) << pWrapSymbol << to_wrap_str;
29393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  }
29493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
29593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  // Add __real_wname -> wname.
29693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  std::string from_real_str = "__real_" + pWrapSymbol;
29793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  mcld::StringEntry<llvm::StringRef>* from_real =
29852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao             mLDConfig->scripts().renameMap().insert(from_real_str, exist);
29993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  from_real->setValue(pWrapSymbol);
30093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
30193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  if (exist) {
30293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    mcld::warning(mcld::diag::rewrap) << pWrapSymbol << from_real_str;
30393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  }
30493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
30593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  return;
30693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
30793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
30893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::addPortable(const std::string &pPortableSymbol) {
30993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  bool exist = false;
31093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
31193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  // Add pname -> pname_portable.
31293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  mcld::StringEntry<llvm::StringRef>* to_port =
31352acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao                mLDConfig->scripts().renameMap().insert(pPortableSymbol, exist);
31493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
31593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  std::string to_port_str = pPortableSymbol + "_portable";
31693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  to_port->setValue(to_port_str);
31793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
31893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  if (exist) {
31993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    mcld::warning(mcld::diag::rewrap) << pPortableSymbol << to_port_str;
32093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
32193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
32293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  // Add __real_pname -> pname.
32393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  std::string from_real_str = "__real_" + pPortableSymbol;
32493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  mcld::StringEntry<llvm::StringRef>* from_real =
32552acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao           mLDConfig->scripts().renameMap().insert(from_real_str, exist);
32693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
32793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  from_real->setValue(pPortableSymbol);
32893c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
32993c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  if (exist) {
33093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao    mcld::warning(mcld::diag::rewrap) << pPortableSymbol << from_real_str;
33193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  }
33293c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
33393c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  return;
33493c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
33593c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao
33693c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liaovoid LinkerConfig::addSearchDir(const std::string &pDirPath) {
33793c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  // SearchDirs will remove the created MCLDDirectory.
33852acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao  if (!mLDConfig->options().directories().insert(pDirPath)) {
33952acbab46d32526a42f9015f175ea9a552426966Shih-wei Liao    mcld::warning(mcld::diag::warn_cannot_open_search_dir) << pDirPath;
34093c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao  }
34193c8832a6916a54d984764bf83a8a77cbae4143bShih-wei Liao}
342