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