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