1//===- CommandLine.cpp ----------------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#include <mcld/Support/CommandLine.h> 10#include <llvm/ADT/StringRef.h> 11#include <llvm/ADT/Twine.h> 12#include <llvm/Support/ErrorHandling.h> 13 14using namespace llvm; 15using namespace llvm::cl; 16 17using namespace mcld; 18 19//===----------------------------------------------------------------------===// 20// parser<mcld::sys::fs::Path> 21//===----------------------------------------------------------------------===// 22bool parser<mcld::sys::fs::Path>::parse(llvm::cl::Option &O, 23 llvm::StringRef ArgName, 24 llvm::StringRef Arg, 25 mcld::sys::fs::Path &Val) 26{ 27 Val.assign<llvm::StringRef::const_iterator>(Arg.begin(), Arg.end()); 28 return false; 29} 30 31static const size_t MaxOptWidth = 8; // arbitrary spacing for printOptionDiff 32 33void parser<mcld::sys::fs::Path>::printOptionDiff(const llvm::cl::Option &O, 34 const mcld::sys::fs::Path &V, 35 parser<mcld::sys::fs::Path>::OptVal Default, 36 size_t GlobalWidth) const 37{ 38 printOptionName(O, GlobalWidth); 39 outs() << "= " << V; 40 size_t VSize = V.native().size(); 41 size_t NumSpaces = MaxOptWidth > VSize ? MaxOptWidth - VSize : 0; 42 outs().indent(NumSpaces) << " (default: "; 43 if (Default.hasValue()) 44 outs() << Default.getValue().c_str(); 45 else 46 outs() << "*no default*"; 47 outs() << ")\n"; 48} 49 50void parser<mcld::sys::fs::Path>::anchor() 51{ 52 // do nothing 53} 54 55//===----------------------------------------------------------------------===// 56// parser<mcld::MCLDDirectory> 57//===----------------------------------------------------------------------===// 58bool parser<mcld::MCLDDirectory>::parse(llvm::cl::Option &O, 59 llvm::StringRef ArgName, 60 llvm::StringRef Arg, 61 mcld::MCLDDirectory &Val) 62{ 63 Val.assign(Arg); 64 return false; 65} 66 67void parser<mcld::MCLDDirectory>::printOptionDiff(const llvm::cl::Option &O, 68 const mcld::MCLDDirectory &V, 69 parser<mcld::MCLDDirectory>::OptVal Default, 70 size_t GlobalWidth) const 71{ 72 printOptionName(O, GlobalWidth); 73 outs() << "= " << V.name(); 74 size_t VSize = V.name().size(); 75 size_t NumSpaces = MaxOptWidth > VSize ? MaxOptWidth - VSize : 0; 76 outs().indent(NumSpaces) << " (default: "; 77 if (Default.hasValue()) 78 outs() << Default.getValue().name(); 79 else 80 outs() << "*no default*"; 81 outs() << ")\n"; 82} 83 84void parser<mcld::MCLDDirectory>::anchor() 85{ 86 // do nothing 87} 88 89//===----------------------------------------------------------------------===// 90// parser<mcld::ZOption> 91//===----------------------------------------------------------------------===// 92bool parser<mcld::ZOption>::parse(llvm::cl::Option &O, 93 llvm::StringRef ArgName, 94 llvm::StringRef Arg, 95 mcld::ZOption &Val) 96{ 97 if (0 == Arg.compare("combreloc")) 98 Val.setKind(ZOption::CombReloc); 99 else if (0 == Arg.compare("nocombreloc")) 100 Val.setKind(ZOption::NoCombReloc); 101 else if (0 == Arg.compare("defs")) 102 Val.setKind(ZOption::Defs); 103 else if (0 == Arg.compare("execstack")) 104 Val.setKind(ZOption::ExecStack); 105 else if (0 == Arg.compare("noexecstack")) 106 Val.setKind(ZOption::NoExecStack); 107 else if (0 == Arg.compare("initfirst")) 108 Val.setKind(ZOption::InitFirst); 109 else if (0 == Arg.compare("interpose")) 110 Val.setKind(ZOption::InterPose); 111 else if (0 == Arg.compare("loadfltr")) 112 Val.setKind(ZOption::LoadFltr); 113 else if (0 == Arg.compare("muldefs")) 114 Val.setKind(ZOption::MulDefs); 115 else if (0 == Arg.compare("nocopyreloc")) 116 Val.setKind(ZOption::NoCopyReloc); 117 else if (0 == Arg.compare("nodefaultlib")) 118 Val.setKind(ZOption::NoDefaultLib); 119 else if (0 == Arg.compare("nodelete")) 120 Val.setKind(ZOption::NoDelete); 121 else if (0 == Arg.compare("nodlopen")) 122 Val.setKind(ZOption::NoDLOpen); 123 else if (0 == Arg.compare("nodump")) 124 Val.setKind(ZOption::NoDump); 125 else if (0 == Arg.compare("relro")) 126 Val.setKind(ZOption::Relro); 127 else if (0 == Arg.compare("norelro")) 128 Val.setKind(ZOption::NoRelro); 129 else if (0 == Arg.compare("lazy")) 130 Val.setKind(ZOption::Lazy); 131 else if (0 == Arg.compare("now")) 132 Val.setKind(ZOption::Now); 133 else if (0 == Arg.compare("origin")) 134 Val.setKind(ZOption::Origin); 135 else if (Arg.startswith("common-page-size=")) { 136 Val.setKind(ZOption::CommPageSize); 137 long long unsigned size = 0; 138 Arg.drop_front(17).getAsInteger(0, size); 139 Val.setPageSize(static_cast<uint64_t>(size)); 140 } else if (Arg.startswith("max-page-size=")) { 141 Val.setKind(ZOption::MaxPageSize); 142 long long unsigned size = 0; 143 Arg.drop_front(14).getAsInteger(0, size); 144 Val.setPageSize(static_cast<uint64_t>(size)); 145 } 146 147 if (ZOption::Unknown == Val.kind()) 148 llvm::report_fatal_error(llvm::Twine("unknown -z option: `") + 149 Arg + 150 llvm::Twine("'\n")); 151 return false; 152} 153 154void parser<mcld::ZOption>::printOptionDiff(const llvm::cl::Option &O, 155 const mcld::ZOption &V, 156 parser<mcld::ZOption>::OptVal Default, 157 size_t GlobalWidth) const 158{ 159 // TODO 160} 161 162void parser<mcld::ZOption>::anchor() 163{ 164 // do nothing 165} 166 167