15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- CommandLine.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//===----------------------------------------------------------------------===//
9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/CommandLine.h>
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/StringRef.h>
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/ADT/Twine.h>
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/ErrorHandling.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace llvm;
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace llvm::cl;
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
17affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcld;
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
19cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// parser<mcld::sys::fs::Path>
21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool parser<mcld::sys::fs::Path>::parse(llvm::cl::Option &O,
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       llvm::StringRef ArgName,
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       llvm::StringRef Arg,
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       mcld::sys::fs::Path &Val)
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Val.assign<llvm::StringRef::const_iterator>(Arg.begin(), Arg.end());
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return false;
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic const size_t MaxOptWidth = 8;  // arbitrary spacing for printOptionDiff
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid parser<mcld::sys::fs::Path>::printOptionDiff(const llvm::cl::Option &O,
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                                  const mcld::sys::fs::Path &V,
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                                  parser<mcld::sys::fs::Path>::OptVal Default,
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                                  size_t GlobalWidth) const
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  printOptionName(O, GlobalWidth);
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  outs() << "= " << V;
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t VSize = V.native().size();
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t NumSpaces = MaxOptWidth > VSize ? MaxOptWidth - VSize : 0;
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  outs().indent(NumSpaces) << " (default: ";
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (Default.hasValue())
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    outs() << Default.getValue().c_str();
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    outs() << "*no default*";
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  outs() << ")\n";
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid parser<mcld::sys::fs::Path>::anchor()
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // do nothing
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// parser<mcld::MCLDDirectory>
57cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool parser<mcld::MCLDDirectory>::parse(llvm::cl::Option &O,
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                llvm::StringRef ArgName,
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                llvm::StringRef Arg,
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                mcld::MCLDDirectory &Val)
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Val.assign(Arg);
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return false;
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid parser<mcld::MCLDDirectory>::printOptionDiff(const llvm::cl::Option &O,
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                                  const mcld::MCLDDirectory &V,
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                                  parser<mcld::MCLDDirectory>::OptVal Default,
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                                  size_t GlobalWidth) const
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  printOptionName(O, GlobalWidth);
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  outs() << "= " << V.name();
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t VSize = V.name().size();
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t NumSpaces = MaxOptWidth > VSize ? MaxOptWidth - VSize : 0;
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  outs().indent(NumSpaces) << " (default: ";
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (Default.hasValue())
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    outs() << Default.getValue().name();
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    outs() << "*no default*";
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  outs() << ")\n";
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid parser<mcld::MCLDDirectory>::anchor()
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // do nothing
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
89cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// parser<mcld::ZOption>
91cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
92affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool parser<mcld::ZOption>::parse(llvm::cl::Option &O,
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                  llvm::StringRef ArgName,
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                  llvm::StringRef Arg,
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                  mcld::ZOption &Val)
96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  if (0 == Arg.compare("combreloc"))
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::CombReloc);
99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("nocombreloc"))
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::NoCombReloc);
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("defs"))
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::Defs);
103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("execstack"))
104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::ExecStack);
105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("noexecstack"))
106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::NoExecStack);
107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("initfirst"))
108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::InitFirst);
109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("interpose"))
110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::InterPose);
111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("loadfltr"))
112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::LoadFltr);
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("muldefs"))
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::MulDefs);
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("nocopyreloc"))
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::NoCopyReloc);
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("nodefaultlib"))
118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::NoDefaultLib);
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("nodelete"))
120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::NoDelete);
121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("nodlopen"))
122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::NoDLOpen);
123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("nodump"))
124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::NoDump);
125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("relro"))
126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::Relro);
127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("norelro"))
128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::NoRelro);
129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("lazy"))
130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::Lazy);
131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("now"))
132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::Now);
133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (0 == Arg.compare("origin"))
134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::Origin);
135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  else if (Arg.startswith("common-page-size=")) {
136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::CommPageSize);
137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    long long unsigned size = 0;
138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Arg.drop_front(17).getAsInteger(0, size);
139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setPageSize(static_cast<uint64_t>(size));
140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  } else if (Arg.startswith("max-page-size=")) {
141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setKind(ZOption::MaxPageSize);
142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    long long unsigned size = 0;
143affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Arg.drop_front(14).getAsInteger(0, size);
144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Val.setPageSize(static_cast<uint64_t>(size));
145affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
146affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
147affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  if (ZOption::Unknown == Val.kind())
148affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    llvm::report_fatal_error(llvm::Twine("unknown -z option: `") +
149affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                             Arg +
150affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                             llvm::Twine("'\n"));
151affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return false;
152affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
153affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
154affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid parser<mcld::ZOption>::printOptionDiff(const llvm::cl::Option &O,
155affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                            const mcld::ZOption &V,
156affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                            parser<mcld::ZOption>::OptVal Default,
157affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                            size_t GlobalWidth) const
158affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
159affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // TODO
160affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
161affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
162affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid parser<mcld::ZOption>::anchor()
163affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
164affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // do nothing
165affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
166affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
167