LinkerConfig.cpp revision cedee4b38f4786845183be7f5916dd520a170ae0
1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- LinkerConfig.cpp ---------------------------------------------------===//
2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//                     The MCLinker Project
4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source
6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details.
7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include "alone/Support/LinkerConfig.h"
1167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao#include "alone/Support/Log.h"
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/Signals.h>
14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/MCLDInfo.h>
1667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao#include <mcld/MC/MCLDFile.h>
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/MCLDDirectory.h>
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/TextDiagnosticPrinter.h>
19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/Path.h>
20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MsgHandling.h>
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/raw_ostream.h>
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
23affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace alone;
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
25affc150dc44fab1911775a49636d0ce85333b634Zonr ChangLinkerConfig::LinkerConfig(const std::string &pTriple)
2667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  : mTriple(pTriple), mShared(false), mSOName(), mTarget(NULL), mLDInfo(NULL),
2767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao    mDiagLineInfo(NULL), mDiagPrinter(NULL) {
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  initializeTarget();
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  initializeLDInfo();
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  initializeDiagnostic();
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei LiaoLinkerConfig::~LinkerConfig() {
3567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  delete mLDInfo;
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  if (mDiagPrinter->getNumErrors() != 0) {
3867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao    // If here, the program failed ungracefully. Run the interrupt handlers to
3967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao    // ensure any other cleanups (e.g., files that registered by
4067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao    // RemoveFileOnSignal(...)) getting done before exit.
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    llvm::sys::RunInterruptHandlers();
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mDiagPrinter->finish();
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  delete mDiagLineInfo;
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  delete mDiagPrinter;
47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaobool LinkerConfig::initializeTarget() {
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  std::string error;
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mTarget = mcld::TargetRegistry::lookupTarget(mTriple, error);
52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  if (NULL != mTarget) {
53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return true;
54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  } else {
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    ALOGE("Cannot initialize mcld::Target for given triple '%s'! (%s)\n",
56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang          mTriple.c_str(), error.c_str());
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return false;
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
6167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaobool LinkerConfig::initializeLDInfo() {
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  if (NULL != mLDInfo) {
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    ALOGE("Cannot initialize mcld::MCLDInfo for given triple '%s!\n",
64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang          mTriple.c_str());
65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return false;
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mLDInfo = new mcld::MCLDInfo(getTriple(), 1, 32);
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return true;
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaobool LinkerConfig::initializeDiagnostic() {
7367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  // Set up MsgHandler.
7467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  mDiagLineInfo = mTarget->createDiagnosticLineInfo(*mTarget, mTriple);
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mDiagPrinter = new mcld::TextDiagnosticPrinter(mcld::errs(), *mLDInfo);
77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mcld::InitializeDiagnosticEngine(*mLDInfo, mDiagLineInfo, mDiagPrinter);
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return true;
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaovoid LinkerConfig::setShared(bool pEnable) {
8467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  mShared = pEnable;
8567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  return;
8667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao}
8767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
8867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaovoid LinkerConfig::setBsymbolic(bool pEnable) {
8967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  mLDInfo->options().setBsymbolic(pEnable);
9067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  return;
9167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao}
9267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
9367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaovoid LinkerConfig::setSOName(const std::string &pSOName) {
94cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  mSOName = pSOName;
9567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  return;
9667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao}
9767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
9867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaovoid LinkerConfig::setDyld(const std::string &pDyld) {
9967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  mLDInfo->options().setDyld(pDyld);
10067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  return;
10167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao}
10267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
10367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaovoid LinkerConfig::setSysRoot(const std::string &pSysRoot) {
104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mLDInfo->options().setSysroot(mcld::sys::fs::Path(pSysRoot));
10567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  return;
106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaovoid LinkerConfig::addWrap(const std::string &pWrapSymbol) {
109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool exist = false;
110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
11167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  // Add wname -> __wrap_wname.
112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mcld::StringEntry<llvm::StringRef>* to_wrap =
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang               mLDInfo->scripts().renameMap().insert(pWrapSymbol, exist);
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  std::string to_wrap_str = "__wrap_" + pWrapSymbol;
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  to_wrap->setValue(to_wrap_str);
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
11867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  if (exist) {
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    mcld::warning(mcld::diag::rewrap) << pWrapSymbol << to_wrap_str;
12067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  }
121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
12267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  // Add __real_wname -> wname.
123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  std::string from_real_str = "__real_" + pWrapSymbol;
124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mcld::StringEntry<llvm::StringRef>* from_real =
125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang             mLDInfo->scripts().renameMap().insert(from_real_str, exist);
126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  from_real->setValue(pWrapSymbol);
127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
12867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  if (exist) {
129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    mcld::warning(mcld::diag::rewrap) << pWrapSymbol << from_real_str;
13067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  }
13167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
13267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  return;
133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
13567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaovoid LinkerConfig::addPortable(const std::string &pPortableSymbol) {
13667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  bool exist = false;
13767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
13867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  // Add pname -> pname_portable.
13967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  mcld::StringEntry<llvm::StringRef>* to_port =
14067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao                mLDInfo->scripts().renameMap().insert(pPortableSymbol, exist);
14167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
14267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  std::string to_port_str = pPortableSymbol + "_portable";
14367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  to_port->setValue(to_port_str);
14467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
14567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  if (exist) {
14667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao    mcld::warning(mcld::diag::rewrap) << pPortableSymbol << to_port_str;
14767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao}
14867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
14967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  // Add __real_pname -> pname.
15067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  std::string from_real_str = "__real_" + pPortableSymbol;
15167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  mcld::StringEntry<llvm::StringRef>* from_real =
15267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao           mLDInfo->scripts().renameMap().insert(from_real_str, exist);
15367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
15467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  from_real->setValue(pPortableSymbol);
15567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
15667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  if (exist) {
15767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao    mcld::warning(mcld::diag::rewrap) << pPortableSymbol << from_real_str;
15867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  }
15967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
16067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  return;
16167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao}
16267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
16367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaovoid LinkerConfig::addSearchDir(const std::string &pDirPath) {
164affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // SearchDirs will remove the created MCLDDirectory.
165affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mcld::MCLDDirectory* sd = new mcld::MCLDDirectory(pDirPath);
166affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
16767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  if (sd->isInSysroot()) {
168affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    sd->setSysroot(mLDInfo->options().sysroot());
16967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  }
17067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
171affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  if (exists(sd->path()) && is_directory(sd->path())) {
172affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    mLDInfo->options().directories().add(*sd);
17367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  } else {
174affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    mcld::warning(mcld::diag::warn_cannot_open_search_dir) << sd->name();
17567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  }
176affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
17767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  return;
17867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao}
179