Mercurial > projects > ldc
view gen/cl_helpers.cpp @ 986:a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Note: For a backward compatible interface, use the new bin/ldmd script. It
supports all old options while passing on anything it doesn't recognize.
Some changes caused by this:
* -debug and -version are now -d-debug and -d-version due to a conflict with
standard LLVM options.
* All "flag" options now allow an optional =true/=1/=false/=0 suffix.
* Some "hidden debug switches" starting with "--" were renamed because LLVM
doesn't care about the number of dashes, so they were conflicting with other
options (such as -c).
The new versions start with "-hidden-debug-" instead of "--"
* --help works, but has a non-zero exit code. This breaks some Tango scripts
which use it to test for compiler existence. See tango.patch.
Some changes not (directly) caused by this;
* (-enable/-disable)-FOO options are now available for pre- and postconditions.
* -march is used instead of -m (like other LLVM programs), but -m is an alias
for it.
* -defaultlib, -debuglib, -d-debug and -d-version allow comma-separated values.
The effect should be identical to specifying the same option multiple times.
I decided against allowing these for some other options because paths might
contain commas on some systems.
* -fPIC is removed in favor of the standard LLVM option -relocation-model=pic
Bug:
* If -run is specified as the last argument in DFLAGS, no error is generated.
(Not very serious IMHO)
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Wed, 25 Feb 2009 17:34:51 +0100 |
parents | |
children | 40d7f9b7357f |
line wrap: on
line source
#include "gen/cl_helpers.h" #include "dmd/root.h" #include "dmd/mem.h" #include <cctype> // isupper, tolower #include <algorithm> #include <utility> #include <stdarg.h> namespace opts { // Helper function static char toLower(char c) { if (isupper(c)) return tolower(c); return c; } bool FlagParser::parse(cl::Option &O, const char *ArgName, const std::string &Arg, bool &Val) { // Make a std::string out of it to make comparisons easier // (and avoid repeated conversion) std::string argname = ArgName; typedef std::vector<std::pair<std::string, bool> >::iterator It; for (It I = switches.begin(), E = switches.end(); I != E; ++I) { std::string name = I->first; if (name == argname || (name.length() < argname.length() && argname.substr(0, name.length()) == name && argname[name.length()] == '=')) { if (!cl::parser<bool>::parse(O, ArgName, Arg, Val)) { Val = (Val == I->second); return false; } // Invalid option value break; } } return true; } void FlagParser::getExtraOptionNames(std::vector<const char*> &Names) { typedef std::vector<std::pair<std::string, bool> >::iterator It; for (It I = switches.begin() + 1, E = switches.end(); I != E; ++I) { Names.push_back(I->first.c_str()); } } MultiSetter::MultiSetter(bool invert, bool* p, ...) { this->invert = invert; if (p) { locations.push_back(p); va_list va; va_start(va, p); while (p = va_arg(va, bool*)) { locations.push_back(p); } } } void MultiSetter::operator=(bool val) { typedef std::vector<bool*>::iterator It; for (It I = locations.begin(), E = locations.end(); I != E; ++I) { **I = (val != invert); } } void ArrayAdapter::push_back(const char* cstr) { if (!cstr || !*cstr) error("Expected argument to '-%s'", name); if (!*arrp) *arrp = new Array; (*arrp)->push(mem.strdup(cstr)); } } // namespace opts