Mercurial > projects > ldc
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/cl_helpers.cpp Wed Feb 25 17:34:51 2009 +0100 @@ -0,0 +1,81 @@ +#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