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//===----------------------------------------------------------------------===//
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/GeneralOptions.h>
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/MC/Input.h>
1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/MC/ZOption.h>
12a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines#include <cassert>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// GeneralOptions
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
19affc150dc44fab1911775a49636d0ce85333b634Zonr ChangGeneralOptions::GeneralOptions()
20533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  : m_Verbose(-1),
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_MaxErrorNum(-1),
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_MaxWarnNum(-1),
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_ExecStack(Unknown),
2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_NoUndefined(Unknown),
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_MulDefs(Unknown),
26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_CommPageSize(0x0),
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_MaxPageSize(0x0),
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bCombReloc(true),
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bInitFirst(false),
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bInterPose(false),
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bLoadFltr(false),
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bNoCopyReloc(false),
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bNoDefaultLib(false),
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bNoDelete(false),
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bNoDLOpen(false),
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bNoDump(false),
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bRelro(false),
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bNow(false),
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bOrigin(false),
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bTrace(false),
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_Bsymbolic(false),
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_Bgroup(false),
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bPIE(false),
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_bColor(true),
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_bCreateEhFrameHdr(false),
46d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_bNMagic(false),
47d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_bOMagic(false),
48d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_bStripDebug(false),
49d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_bExportDynamic(false),
50d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_bWarnSharedTextrel(false),
51d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_bBinaryInput(false),
52d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_bDefineCommon(false),
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    m_bFatalWarnings(false),
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    m_bNewDTags(false),
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    m_bNoStdlib(false),
5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_bWarnMismatch(true),
5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_bGCSections(false),
58a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines    m_bPrintGCSections(false),
5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_bGenUnwindInfo(true),
60a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines    m_bPrintICFSections(false),
61a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines    m_ICF(ICF_None),
62a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines    m_ICFIterations(0) ,
63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    m_GPSize(8),
646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    m_StripSymbols(KeepAllSymbols),
656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    m_HashStyle(SystemV) {
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
68affc150dc44fab1911775a49636d0ce85333b634Zonr ChangGeneralOptions::~GeneralOptions()
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid GeneralOptions::setSOName(const std::string& pName)
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t pos = pName.find_last_of(sys::fs::separator);
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (std::string::npos == pos)
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_SOName = pName;
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  else
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_SOName = pName.substr(pos + 1);
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
81affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid GeneralOptions::addZOption(const ZOption& pOption)
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  switch (pOption.kind()) {
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::CombReloc:
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bCombReloc = true;
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoCombReloc:
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bCombReloc = false;
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::Defs:
9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      m_NoUndefined = YES;
92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::ExecStack:
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_ExecStack = YES;
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoExecStack:
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_ExecStack = NO;
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::InitFirst:
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bInitFirst = true;
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::InterPose:
103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bInterPose = true;
104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::LoadFltr:
106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bLoadFltr = true;
107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::MulDefs:
10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      m_MulDefs = YES;
110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoCopyReloc:
112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNoCopyReloc = true;
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoDefaultLib:
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNoDefaultLib = true;
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoDelete:
118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNoDelete = true;
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoDLOpen:
121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNoDLOpen = true;
122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoDump:
124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNoDump = true;
125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::NoRelro:
127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bRelro = false;
128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::Relro:
130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bRelro = true;
131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::Lazy:
133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNow = false;
134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::Now:
136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bNow = true;
137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::Origin:
139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_bOrigin = true;
140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::CommPageSize:
142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_CommPageSize = pOption.pageSize();
143affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::MaxPageSize:
145affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      m_MaxPageSize = pOption.pageSize();
146affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
147affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    case ZOption::Unknown:
148affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    default:
149affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      assert(false && "Not a recognized -z option.");
150affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      break;
151affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
152affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
153a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines
154a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hinesbool GeneralOptions::isInExcludeLIBS(const Input& pInput) const
155a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines{
156a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  assert(pInput.type() == Input::Archive);
157a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines
158a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  if (m_ExcludeLIBS.empty()) {
159a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines    return false;
160a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  }
161a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines
162a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  // Specifying "--exclude-libs ALL" excludes symbols in all archive libraries
163a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  // from automatic export.
164a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  if (m_ExcludeLIBS.count("ALL") != 0) {
165a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines    return true;
166a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  }
167a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines
168a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  std::string name(pInput.name());
169a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  name.append(".a");
170a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  if (m_ExcludeLIBS.count(name) != 0) {
171a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines    return true;
172a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  }
173a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines
174a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  return false;
175a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines}
176