122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- GeneralOptions.cpp -------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/GeneralOptions.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/Input.h"
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/ZOption.h"
120dea6bc96bb52346737966839ac68644f7939f58Stephen Hines#include <cassert>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// GeneralOptions
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
19affc150dc44fab1911775a49636d0ce85333b634Zonr ChangGeneralOptions::GeneralOptions()
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : m_Verbose(-1),
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_MaxErrorNum(-1),
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_MaxWarnNum(-1),
232bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar      m_NumSpareDTags(5),
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_ExecStack(Unknown),
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_NoUndefined(Unknown),
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_MulDefs(Unknown),
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_CommPageSize(0x0),
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_MaxPageSize(0x0),
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bCombReloc(true),
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bInitFirst(false),
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bInterPose(false),
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bLoadFltr(false),
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bNoCopyReloc(false),
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bNoDefaultLib(false),
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bNoDelete(false),
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bNoDLOpen(false),
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bNoDump(false),
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bRelro(false),
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bNow(false),
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bOrigin(false),
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bTrace(false),
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Bsymbolic(false),
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Bgroup(false),
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bPIE(false),
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bColor(true),
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bCreateEhFrameHdr(false),
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bNMagic(false),
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bOMagic(false),
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bStripDebug(false),
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bExportDynamic(false),
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bWarnSharedTextrel(false),
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bBinaryInput(false),
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bDefineCommon(false),
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bFatalWarnings(false),
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bNewDTags(false),
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bNoStdlib(false),
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bWarnMismatch(true),
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bGCSections(false),
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bPrintGCSections(false),
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bGenUnwindInfo(true),
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bPrintICFSections(false),
622bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar      m_ICF(ICF::None),
632bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar      m_ICFIterations(2),
642bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar      m_StripSymbols(StripSymbolMode::KeepAllSymbols),
652bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar      m_HashStyle(HashStyle::SystemV) {
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
6837b74a387bb3993387029859c2d9d051c41c724eStephen HinesGeneralOptions::~GeneralOptions() {
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid GeneralOptions::setSOName(const std::string& pName) {
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t pos = pName.find_last_of(sys::fs::separator);
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (std::string::npos == pos)
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_SOName = pName;
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  else
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_SOName = pName.substr(pos + 1);
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid GeneralOptions::addZOption(const ZOption& pOption) {
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  switch (pOption.kind()) {
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::CombReloc:
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bCombReloc = true;
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoCombReloc:
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bCombReloc = false;
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::Defs:
8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      m_NoUndefined = YES;
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::ExecStack:
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_ExecStack = YES;
92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoExecStack:
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_ExecStack = NO;
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::InitFirst:
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bInitFirst = true;
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::InterPose:
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bInterPose = true;
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::LoadFltr:
103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bLoadFltr = true;
104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::MulDefs:
10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      m_MulDefs = YES;
107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoCopyReloc:
109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNoCopyReloc = true;
110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoDefaultLib:
112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNoDefaultLib = true;
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoDelete:
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNoDelete = true;
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoDLOpen:
118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNoDLOpen = true;
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoDump:
121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNoDump = true;
122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoRelro:
124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bRelro = false;
125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::Relro:
127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bRelro = true;
128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::Lazy:
130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNow = false;
131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::Now:
133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNow = true;
134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::Origin:
136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bOrigin = true;
137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::CommPageSize:
139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_CommPageSize = pOption.pageSize();
140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::MaxPageSize:
142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_MaxPageSize = pOption.pageSize();
143affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::Unknown:
145affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    default:
146affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      assert(false && "Not a recognized -z option.");
147affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
148affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
149affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
1500dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
15137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool GeneralOptions::isInExcludeLIBS(const Input& pInput) const {
1520dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  assert(pInput.type() == Input::Archive);
1530dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
1540dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  if (m_ExcludeLIBS.empty()) {
1550dea6bc96bb52346737966839ac68644f7939f58Stephen Hines    return false;
1560dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  }
1570dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
1580dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  // Specifying "--exclude-libs ALL" excludes symbols in all archive libraries
1590dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  // from automatic export.
1600dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  if (m_ExcludeLIBS.count("ALL") != 0) {
1610dea6bc96bb52346737966839ac68644f7939f58Stephen Hines    return true;
1620dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  }
1630dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
1640dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  std::string name(pInput.name());
1650dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  name.append(".a");
1660dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  if (m_ExcludeLIBS.count(name) != 0) {
1670dea6bc96bb52346737966839ac68644f7939f58Stephen Hines    return true;
1680dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  }
1690dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
1700dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  return false;
1710dea6bc96bb52346737966839ac68644f7939f58Stephen Hines}
17237b74a387bb3993387029859c2d9d051c41c724eStephen Hines
17337b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
174